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

Hello,

Merci pour le partage de cette API ! Et merci pour les ajustements en cours pour pouvoir l’utiliser.

J’ai essayé d’injecter le résultat du calcul à un des mes devices mais ça ne fonctionne pas.

L’URL du post : https://api.gladysgateway.com/v1/api/device/state/

J’ai essayé l’injection sans la variable et ça fonctionne.

Est-ce que je fais mal ou le résultat de l’API n’est pas au bon format ?

Merci pour votre aide

Tu es sûr du contenu de la variable ? Tu as testé dans un action « envoyer un message » ce que ça te retourne ?

Bonjour @pierre-gilles, l’envoi en message fonctionne bien.

Au cas où, voici l’extrait de la feature du device MQTT :

@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 »