Faire une opération mathématique sur une “variable de scène”

@PhilippeMA Tout me semble bon. Je suis allé voir côté Gladys Plus si je voyais une erreur passer, mais rien.

Est-ce que tu peux regarder tes logs Gladys au moment où tu envoie la requête peut-être ?

Bien vu, il y a une erreur :

2022-10-04T10:04:30+0200 <warn> scene.executeActions.js:37 (executeAction) Error: Parse error on line 2:
...": {{1.0.data.result}}}
-----------------------^
Expecting 'CLOSE', 'OPEN_SEXPR', 'ID', 'STRING', 'NUMBER', 'BOOLEAN', 'UNDEFINED', 'NULL', 'DATA', got 'CLOSE_UNESCAPED'
    at Parser.parseError (/src/server/node_modules/handlebars/dist/cjs/handlebars/compiler/parser.js:267:19)
    at Parser.parse (/src/server/node_modules/handlebars/dist/cjs/handlebars/compiler/parser.js:336:30)
    at parseWithoutProcessing (/src/server/node_modules/handlebars/dist/cjs/handlebars/compiler/base.js:46:33)
    at HandlebarsEnvironment.parse (/src/server/node_modules/handlebars/dist/cjs/handlebars/compiler/base.js:52:13)
    at compileInput (/src/server/node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js:508:19)
    at ret (/src/server/node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js:517:18)
    at Object.http.request (/src/server/lib/scene/scene.actions.js:250:76)
    at executeAction (/src/server/lib/scene/scene.executeActions.js:32:35)
    at /src/server/lib/scene/scene.executeActions.js:66:13
    at tryCatcher (/src/server/node_modules/bluebird/js/release/util.js:16:23)
    at MappingPromiseArray._promiseFulfilled (/src/server/node_modules/bluebird/js/release/map.js:68:38)
    at MappingPromiseArray.PromiseArray._iterate (/src/server/node_modules/bluebird/js/release/promise_array.js:115:31)
    at MappingPromiseArray.init (/src/server/node_modules/bluebird/js/release/promise_array.js:79:10)
    at MappingPromiseArray._asyncInit (/src/server/node_modules/bluebird/js/release/map.js:37:10)
    at _drainQueueStep (/src/server/node_modules/bluebird/js/release/async.js:97:12)
    at _drainQueue (/src/server/node_modules/bluebird/js/release/async.js:86:9)
    at Async._drainQueues (/src/server/node_modules/bluebird/js/release/async.js:102:5)
    at Immediate.Async.drainQueues (/src/server/node_modules/bluebird/js/release/async.js:15:14)
    at processImmediate (internal/timers.js:464:21)

Tu me confirmes que tu exécute bien la scène en lançant la scène ? Pas en cliquant sur « Essayer »? (ça ne marchera pas comme indiqué dans la description)

Ah, en fait je vois ce qui ne va pas, @PhilippeMA tu es sur la version de PROD ?

C’est le même bug qu’à reporté @lmilcent, c’est corrigé mais pas encore déployé !

ah d’accord, toutes mes excuses, je n’avais pas compris que c’est ce qui était en train d’être corrigé.

Je te confirme, c’est mon environnement PROD.

Merci @pierre-gilles.

Fix publié dans Gladys Assistant v4.11 :slight_smile:

2 « J'aime »

Bonjour,

je rencontre un bug en utilisant la scène suivante :

et le requête envoyée est la suivante :
image

Ai-je fait une erreur ou c’est un autre bug ?

Dans ton expression si tu as des espaces mathjs te renvoie une erreur.
Si tu es sur mobile et que tu add une variable dans un bloc gladys, j’ai remarqué que celui ci te rajoute tjrs un espace après.
tenter de supprimer les espaces au cas ou cela vienne de là

Sauf que la requête envoyée ne contient pas la valeur de la variable, seulement une expression de la forme {{0.0.last_value}} d’où le retour d’erreur de mathjs.

peut être parce que ta variable ne contient pas la bonne valeur ? tu l’as recup par une api je suppose ?
tu peux montrer comment tu l’as set ?

Je reçois bien la valeur dans l’envoi de message.

image

La valeur provient d’un device créé via MQTT

device alimenté via sur requête dans NodeRed

En fait, cela equivaut au bug rencontré par lmilcent le 22/09, bug qui avait été corrigé. Une régression ?

N’oublies pas que la scene doit se declencher seule pour que ça marche. Le bouton « tester » n’envoie pas de vrai valeur.

Tu as un nom de device et de feature a rallonge peut etre que le soucis est la sinon?

C’est bon, effectivement je faisais mes tests avec le bouton ‹ Essayer ›. Et je confirme également qu’il faut supprimer les espaces sinon pas de résultat de calcul.
Merci pour les infos et pour votre réactivité.

1 « J'aime »

Salut, comme dit ici, j’ai commencé à regarder pour pouvoir faire des calculs directement dans les scènes. Je fais ça sur les blocs « condition » et « contrôler un appareil » voilà ce que ça donne pour l’instant

Maintenant j’ai besoin de vous. Petite explication une fois les variables remplacés par les valeurs lors de l’exécution de la scène, on utilise la librairie mathjs pour exécuter le calcul. Le problème c’est que la méthode utilisée evaluate() pourrait permettre d’injecter du code js non désiré dans Gladys donc on doit limiter cette méthode aux fonctions mathématiques que l’on veut vraiment utiliser dans Gladys. De base, on aura au moins les opérateurs classiques +, -, *, /. Quelles sont les autres fonctions mathématiques que vous souhaiteriez utiliser (ou que vous utilisez déjà avec l’API mathjs) ?
Une liste est disponible ici math.js | an extensive math library for JavaScript and Node.js

3 « J'aime »

Génial, merci pour ton aide pour faire avancer le sujet :blush:

Je partirais sur les opérations basiques que tu évoques, perso je n’ai rien pu utiliser d’autre encore.
Ne pas oublier les parenthèses evidemment !

1 « J'aime »

Pourquoi pas la comparaison de 2 valeurs.
Je ne sais pas si c’est pertinent.
Par exemple comparé la valeur de la température de consigne et la valeur de température dans la pièce.
Alors si les deux valeurs sont égale on stop le chauffage.
Je ne sais pas si c’est réalisable.

4 « J'aime »

peut etre aussi l arrondi et le modulo ?

2 « J'aime »

Oui en effet

Je ne sais pas si tu as vu dans le screenshot, j’ai prévu d’ajouter dans cette PR la possibilité de mettre des variables dans la valeur du bloc « Continuer seulement si », est ce que ce n’est pas ce que tu demandes ?

Oui on peut mettre arrondi au plus proche, arrondi à l’entier supérieur et arrondi à l’entier inférieur ça peut être intéressant d’avoir les 3. Bonne remarque sur le modulo je note

1 « J'aime »