# \[Scènes\] Supporter quelques fonctions supplémentaires de Math.js

**URL:** <https://community.gladysassistant.com/t/scenes-supporter-quelques-fonctions-supplementaires-de-math-js/9509>\
**Category:** Demandes livrées\
**Tags:** feature-core, in-progress\
**Created:** [Mai 12, 2025, 1:03 UTC](https://community.gladysassistant.com/t/scenes-supporter-quelques-fonctions-supplementaires-de-math-js/9509 "2025-05-12T13:03:33Z")\
**Posts on this page:** 14\
**Page:** 1

<div class="post-metadata">

**Author:** ![StephaneB](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/stephaneb/32/15443_2.png) [@StephaneB](https://community.gladysassistant.com/u/StephaneB)\
**Post date:** [Mai 12, 2025, 1:03 UTC](https://community.gladysassistant.com/t/scenes-supporter-quelques-fonctions-supplementaires-de-math-js/9509/1 "2025-05-12T13:03:33Z")

</div>

La v4.58 a ajouté la gestion ‹&nbsp;en natif&nbsp;› de la fonction random de Math.js pour pouvoir l’appeler directement dans les actions permettant de calculer une valeur (et c’est pratique en particulier dans l’action «&nbsp;Attendre&nbsp;»).

Et c’est plus intuitif bien sûr que de devoir utiliser l’alternative avec l’action «&nbsp;Requête HTTP&nbsp;» tel que décrit [ici](https://community.gladysassistant.com/t/faire-une-operation-mathematique-sur-une-variable-de-scene/7030/23).

J’aurais besoin d’utiliser la fonction math.js ‹&nbsp;exp&nbsp;›, pour définir une durée d’arrosage qui s’intensifie de la façon suivante quand ma cuve est bien remplie :

 ![Capture d'écran 2025-05-12 145623](https://gladys-assistant-community.b-cdn.net/uploads/default/original/3X/0/b/0be69181154a9c85e011571d98f044fa80bc07c4.png)

Je n’ai pas trouvé dans la doc une liste déjà établie des fonctions mathjs supportées nativement (existe-t-elle, et je l’ai raté ?). D’après mes tests, ces fonctions sont déjà supportées :

- abs
- random
- ceil, floor, round
- compare, larger, largerEq (et donc je suppose aussi smaller, smallerEq,… mais je n’ai pas testé)

Parmi tout ce que propose Math.js, je trouverais intéressant de rajouter les fonctions suivantes :

- min, max, mean
- log, exp, square, sqrt (et peut-être cube et cbrt)

@pierre-gilles est-ce que tu voudrais une demande de fonctionnalité par fonction mathjs ?

---

<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:** [Mai 13, 2025, 6:17 UTC](https://community.gladysassistant.com/t/scenes-supporter-quelques-fonctions-supplementaires-de-math-js/9509/2 "2025-05-13T06:17:16Z")

</div>

> [@StephaneB](#):
>
> @pierre-gilles est-ce que tu voudrais une demande de fonctionnalité par fonction mathjs ?

Non pour le coup celle-ci est suffisante 🙂

Merci pour la demande !

---

<div class="post-metadata">

**Author:** ![Nagromdark](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/nagromdark/32/17758_2.png) [@Nagromdark](https://community.gladysassistant.com/u/Nagromdark)\
**Post date:** [Mai 14, 2025, 10:27 UTC](https://community.gladysassistant.com/t/scenes-supporter-quelques-fonctions-supplementaires-de-math-js/9509/3 "2025-05-14T10:27:14Z")

</div>

@pierre-gilles , où peut-on trouver la liste des fonctions natives utilisables dans les scènes ? merci

---

<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:** [Mai 14, 2025, 5:31 UTC](https://community.gladysassistant.com/t/scenes-supporter-quelques-fonctions-supplementaires-de-math-js/9509/4 "2025-05-14T17:31:57Z")

</div>

Salut @Nagromdark,

Tu as raison, il manque une documentation à ce sujet. Je me suis noté de regarder ça.

En attendant, voilà les fonctions disponibles :

- `add` - Addition
- `divide` - Division
- `larger` - Comparaison «&nbsp;plus grand que&nbsp;» (\>)
- `smaller` - Comparaison «&nbsp;plus petit que&nbsp;» (\<)
- `largerEq` - Comparaison «&nbsp;plus grand ou égal à&nbsp;» (\>=)
- `smallerEq` - Comparaison «&nbsp;plus petit ou égal à&nbsp;» (\<=)
- `mod` - Opération modulo
- `round` - Arrondi de nombres
- `random` - Génération de nombres aléatoires

Pour utiliser ces fonctions, je te conseille la documentation de Mathjs: [https://mathjs.org/](https://mathjs.org/)

Je te tiens au courant dès que j’ai rédigé une documentation plus claire avec des exemples 🙂

---

<div class="post-metadata">

**Author:** ![StephaneB](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/stephaneb/32/15443_2.png) [@StephaneB](https://community.gladysassistant.com/u/StephaneB)\
**Post date:** [Mai 14, 2025, 6:18 UTC](https://community.gladysassistant.com/t/scenes-supporter-quelques-fonctions-supplementaires-de-math-js/9509/5 "2025-05-14T18:18:34Z")

</div>

@pierre-gilles, d’après quelques tests que j’ai fait, les fonctions ‹&nbsp;compare&nbsp;›, ‹&nbsp;abs&nbsp;›, ‹&nbsp;ceil&nbsp;› et ‹&nbsp;floor&nbsp;› fonctionnent aussi.

---

<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:** [Mai 16, 2025, 1:47 UTC](https://community.gladysassistant.com/t/scenes-supporter-quelques-fonctions-supplementaires-de-math-js/9509/6 "2025-05-16T13:47:15Z")

</div>

@Nagromdark @StephaneB J’ai rajouté une nouvelle documentation :

> **[Fonctions mathématiques disponibles | Gladys Assistant](https://gladysassistant.com/fr/docs/scenes/math-functions/)**
>
> Certaines actions de scènes vous permettent d'injecter des variables et d'effectuer des calculs.

J’ai mis à jour la documentation de [Attendre](https://gladysassistant.com/fr/docs/scenes/wait-action/) et [Condition sur variables](https://gladysassistant.com/fr/docs/scenes/continue-only-if-action/) pour mentionner cette page sur les fonctions mathématiques disponibles !

> [@StephaneB](#):
>
> les fonctions ‹ compare ›, ‹ abs ›, ‹ ceil › et ‹ floor ›

J’ai réussi à tout utiliser, sauf `compare` qui ne fonctionne pas chez moi, je ne l’ai pas inclu dans la documentation du coup. Tu avais fais comment ?

---

<div class="post-metadata">

**Author:** ![StephaneB](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/stephaneb/32/15443_2.png) [@StephaneB](https://community.gladysassistant.com/u/StephaneB)\
**Post date:** [Mai 17, 2025, 8:04 UTC](https://community.gladysassistant.com/t/scenes-supporter-quelques-fonctions-supplementaires-de-math-js/9509/7 "2025-05-17T08:04:44Z")

</div>

> [@pierre-gilles](#):
>
> sauf `compare` qui ne fonctionne pas chez moi, je ne l’ai pas inclu dans la documentation du coup. Tu avais fais comment ?

Ben facile, j’avais dû prendre une substance illicite… 😝 Parce que je n’arrive pas non plus à reproduire ce que j’avais cru voir fonctionner… Désolé pour la fausse piste ☺

---

<div class="post-metadata">

**Author:** ![StephaneB](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/stephaneb/32/15443_2.png) [@StephaneB](https://community.gladysassistant.com/u/StephaneB)\
**Post date:** [Mai 17, 2025, 8:14 UTC](https://community.gladysassistant.com/t/scenes-supporter-quelques-fonctions-supplementaires-de-math-js/9509/8 "2025-05-17T08:14:28Z")

</div>

> [@pierre-gilles](#):
>
> J’ai rajouté une nouvelle documentation :

Et merci pour cette page, ce sera très utile. Peut-être que la page pourrait décrire aussi la méthode via une requête HTTP, pour ceux qui voudraient utiliser des méthodes mathjs un peu exotiques ?

---

<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:** [Mai 19, 2025, 8:08 UTC](https://community.gladysassistant.com/t/scenes-supporter-quelques-fonctions-supplementaires-de-math-js/9509/9 "2025-05-19T08:08:18Z")

</div>

> [@StephaneB](#):
>
> Peut-être que la page pourrait décrire aussi la méthode via une requête HTTP, pour ceux qui voudraient utiliser des méthodes mathjs un peu exotiques ?

Tu parles de quelles méthodes plus exotiques ? Je pense ça prendra plus de temps d’écrire cette documentation que de rajouter les méthodes dans Gladys 😛

---

<div class="post-metadata">

**Author:** ![StephaneB](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/stephaneb/32/15443_2.png) [@StephaneB](https://community.gladysassistant.com/u/StephaneB)\
**Post date:** [Mai 20, 2025, 3:26 UTC](https://community.gladysassistant.com/t/scenes-supporter-quelques-fonctions-supplementaires-de-math-js/9509/10 "2025-05-20T15:26:25Z")

</div>

Ben il y a celles que j’avais listées plus haut. Mais sauf si tu as en tête de les ajouter prochainement :

- min, max, mean
- log, exp, square, sqrt (et peut-être cube et cbrt)

Et sinon, il se pourrait qu’un amateur de domotique ET mathématicien 😉 ait envie de se servir des fonctions mathématiques fix(), mod(), gcd(), lcd(), des fonctions logiques and(), not() or(), xor(), de la fonction randomInt(), des fonctions de comparaison compare(), equal(), unequal(), des fonctions de comparaison textes compareText(), equalText(), de la fonction statistique median(), de certaines fonctions trigonométriques, …  
Et encore, je sélectionne celle dont je comprends ce qu’elles font, mais il y en a plein d’autres peut-être utile aussi, je sais pas… C’est pour ça que ça me semblerait utile d’expliquer que l’appel à [mathjs.org](http://mathjs.org) est aussi possible.

---

<div class="post-metadata">

**Author:** ![mutmut](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/mutmut/32/14064_2.png) [@mutmut](https://community.gladysassistant.com/u/mutmut)\
**Post date:** [Mai 20, 2025, 4:57 UTC](https://community.gladysassistant.com/t/scenes-supporter-quelques-fonctions-supplementaires-de-math-js/9509/11 "2025-05-20T16:57:36Z")

</div>

> [@StephaneB](#):
>
> des fonctions de comparaison textes compareText()

alors celle-là elle est pour moi 😜

> [@\[Condition sur variables\] : Ajouter la comparaison de variables TEXT](https://community.gladysassistant.com/t/condition-sur-variables-ajouter-la-comparaison-de-variables-text/9535):
>
> Actuellement on peut comparer des nombres lors d’une Condition sur variables : Maintenant que l’on peut stocker et récupérer des données TEXT en MQTT, Il serait top d’avoir une comparaison sur variables TEXT : Si on ne peut pas avoir tout dans la même fonction, je propose d’avoir 2 fonctions : Condition sur variables numériques Condition sur variables alphanumériques

---

<div class="post-metadata">

**Author:** ![StephaneB](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/stephaneb/32/15443_2.png) [@StephaneB](https://community.gladysassistant.com/u/StephaneB)\
**Post date:** [Mai 20, 2025, 5:24 UTC](https://community.gladysassistant.com/t/scenes-supporter-quelques-fonctions-supplementaires-de-math-js/9509/12 "2025-05-20T17:24:18Z")

</div>

> [@mutmut](#):
>
> alors celle-là elle est pour moi 😜

Je me suis douté que tu allais réagir 😋

---

<div class="post-metadata">

**Author:** ![cursor-bot](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/cursor-bot/32/22252_2.png) [@cursor-bot](https://community.gladysassistant.com/u/cursor-bot)\
**Post date:** [Août 17, 2026, 12:09 UTC](https://community.gladysassistant.com/t/scenes-supporter-quelques-fonctions-supplementaires-de-math-js/9509/13 "2026-08-17T12:09:24Z")

</div>

Salut tout le monde !

Ce sujet est désormais **en cours de développement**.

Une PR a été ouverte pour supporter plus de fonctions mathématiques dans les formules de scènes :

> <https://github.com/GladysAssistant/Gladys/pull/2882>
>
> \### Description
> 
> Scene formulas — the "Computed" value of \*\*Set a variable\*\*, \*\*…Control a device\*\*, \*\*Wait\*\* and \*\*Condition on variables\*\* — run on a deliberately restricted \`mathjs\` instance. Until now that namespace only contained the four arithmetic operators, \`%\`, \`^\`, the comparison operators and \`round()\` / \`random()\`, so a formula like \`sqrt(400)\` or \`min(15, x)\` aborted the scene with "value is not a number".
> 
> This PR extends the namespace with the functions asked for in the forum topic, and makes the whole supported surface discoverable directly in the scene editor.
> 
> \*\*Functions added\*\*
> 
> | Group | Functions |
> |---|---|
> | Rounding & sign | \`abs\`, \`ceil\`, \`floor\`, \`fix\`, \`sign\` |
> | Powers & roots | \`pow\`, \`sqrt\`, \`cbrt\`, \`square\`, \`cube\`, \`nthRoot\`, \`hypot\` |
> | Exponential & logarithm | \`exp\`, \`log\` (with optional base), \`log2\`, \`log10\` |
> | Statistics | \`min\`, \`max\`, \`mean\`, \`median\`, \`sum\`, \`prod\` |
> | Integer arithmetic | \`gcd\`, \`lcm\` |
> | Random | \`randomInt\` |
> | Trigonometry | \`sin\`, \`cos\`, \`tan\`, \`asin\`, \`acos\`, \`atan\`, \`atan2\` |
> | Constants | \`pi\`, \`e\`, \`tau\` |
> 
> \`abs\`, \`ceil\` and \`floor\` happened to work already because \`mathjs\` pulled them in transitively through \`round\`; they are now pinned explicitly like the rest, so a \`mathjs\` upgrade cannot silently remove them.
> 
> The use case from the forum topic now works as a single formula, no HTTP request needed:
> 
> \`\`\`
> round(min(15, exp({{tankLevel}} / 25)) \* 60)
> \`\`\`
> 
> \### Technical changes
> 
> \- \*\*\`server/lib/scene/scene.formula.js\`\*\* (new): the restricted formula engine moves out of \`scene.actions.js\` into its own module, so the supported surface lives in one documented place. Every operator, function and constant is passed explicitly to \`create()\` — \`mathjs\` only guarantees the "math" namespace for what it is given, so anything only reachable transitively could disappear on an upgrade.
> \- \*\*\`server/lib/scene/scene.actions.js\`\*\*: imports the shared \`evaluate\`. The \*\*Control a device\*\* action now wraps the evaluation in a \`try/catch\` and aborts the scene with \`ACTION\_VALUE\_NOT\_A\_NUMBER\` when the formula cannot be evaluated — the three other formula actions already did this, and this action was the only one that let a \`mathjs\` parse error escape. A wider function surface means more ways to write an invalid call (\`gcd(4)\`, a typo'd name), so it now fails closed too.
> \- \*\*Front\*\*: new \`FormulaFunctionsHelp\` component rendered under every formula input (Set a variable, Control a device, Wait, Condition on variables). It lists the available operators, functions and constants, plus a short syntax reminder. Function names are not translatable, so they live in the component and mirror the server module; only the three labels and the example sentence go through i18n (\`en\`, \`fr\`, \`de\`).
> \- \*\*Tests\*\*: \`scene.action.formula.test.js\` grows one case per operator, function and constant (54 tests), so a \`mathjs\` upgrade that drops one fails CI instead of failing silently in production. Plus a fail-closed test for the new \`try/catch\`.
> 
> \### Not included
> 
> \`and\` / \`or\` / \`not\` / \`xor\` / \`equal\` / \`unequal\` and \`compareText\` were mentioned in the forum thread but are left out on purpose:
> 
> \- The formula string is whitespace-stripped before evaluation, so the operator form (\`1 and 0\` → \`1and0\`) cannot parse, and string arguments would be mangled.
> \- They return booleans rather than numbers, which does not fit a pipeline whose four call sites all expect a number — and Gladys already has dedicated "Condition on variables" boxes with AND / OR semantics for that job.
> 
> Every function added here returns a number, so it behaves identically in all four formula actions.
> 
> \## Forum
> 
> Forum: https://community.gladysassistant.com/t/scenes-supporter-quelques-fonctions-supplementaires-de-math-js/9509
> 
> \### 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
> 
> Notes on the checklist: the full server suite passes locally and coverage on the two changed server files is 100% for \`scene.formula.js\` and leaves no new uncovered line in \`scene.actions.js\`. \`front\` passes \`prettier-check\`, \`eslint\`, \`compare-translations\` and \`npm run build\`. Cypress was not run locally (its binary is unavailable in this environment) — the change only adds a static help block under existing inputs and touches no route or form control.
> 
> \---
> \_Generated by \[Claude Code\](https://claude.ai/code/session\_01Twh2gVvdbLtoLLQRukvNvh)\_
> 
> 
> \## Summary by CodeRabbit
> 
> \* \*\*New Features\*\*
> \* Added formula assistance to scene action editors, documenting supported operators, functions, constants, syntax, and examples.
> \* Added English, French, and German translations for formula help.
> \* Expanded formula support for calculations, comparisons, rounding, powers, statistics, trigonometry, and constants.
> 
> \* \*\*Bug Fixes\*\*
> \* Invalid or non-finite formulas now safely stop scenes without changing affected device values or causing execution to hang.
> \* Restricted unsupported formula operations to improve safety and reliability.

N’hésitez pas à suivre la PR, à tester dès que possible et à faire vos retours ici.

---

<div class="post-metadata">

**Author:** ![cursor-bot](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/cursor-bot/32/22252_2.png) [@cursor-bot](https://community.gladysassistant.com/u/cursor-bot)\
**Post date:** [Octobre 12, 2026, 5:07 UTC](https://community.gladysassistant.com/t/scenes-supporter-quelques-fonctions-supplementaires-de-math-js/9509/14 "2026-10-12T17:07:26Z")

</div>


