Solicitud HTTP, cálculo del valor enviado

Bonsoir,

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

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

Salut @jean_bruder :slight_smile:

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 « calculée » dans « Contrôler un appareil ».
  2. Ensuite, tu peux injecter cette valeur calculée dans un JSON comme tu fais ici.

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

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

Buenas noches @pierre-gilles :slight_smile:

Aprovecho el buen ambiente actual del foro y de todos los desarrolladores que no dejan de innovar para desenterrar antiguas solicitudes que no había llevado a cabo… :stuck_out_tongue:

¿Crees que sigue siendo imposible aplicar un cálculo a un valor enviado, porque realmente simplificaría muchos usos: podríamos realizar una consulta GET, luego una POST en reacción interactiva :slight_smile:

Hasta luego,

Buena noche,

Jean

Hola @jean_bruder :slight_smile:

Pues voy a responderte de manera diferente a lo que esperas: no creo que haya que añadir el cálculo en el bloque « Solicitud HTTP », porque todo lo que describes ya es posible hoy :slight_smile:

Primero, el « ¿por qué no? »: el cuerpo de una solicitud HTTP es texto libre. Puede ser JSON, XML, form-urlencoded, cualquier cosa. Si nos pusiéramos a evaluar cálculos dentro, Gladys tendría que adivinar qué parte del texto es una fórmula y qué parte es contenido para enviar tal cual, con el riesgo de romper cuerpos perfectamente válidos en el proceso. Eso significaría inventar una sintaxis especial, documentarla, mantenerla… mientras que separar « calculo » y « envío » sigue siendo más claro, y además te permite reutilizar el valor calculado en otro lugar de la escena.

Y sobre todo: el GET, luego cálculo, luego POST, ya puedes hacerlo, sin nueva funcionalidad.

Lo que faltaba en tu escena el año pasado es simplemente que la respuesta de una solicitud HTTP se expone como variable de escena. Haces tu GET, haces clic una vez en « Probar » para que Gladys descubra las claves de la respuesta, y luego puedes reinyectarlas con {{ en todos los bloques siguientes, incluyendo en una segunda llamada HTTP. Concretamente:

  1. Solicitud HTTP (GET): recuperas tu valor, por ejemplo data.temperature
  2. Controlar un dispositivo: tu dispositivo virtual (integración MQTT), pestaña « Calculada »: {{ data.temperature }} + 2
  3. Recuperar el último estado de ese mismo dispositivo: obtienes una variable numérica limpia
  4. Solicitud HTTP (POST): inyectas esta variable en tu JSON con {{

Funciona, y además tiene un efecto secundario agradable: tu valor calculado se convierte en un verdadero sensor, con historial y gráficos.

Pero te entiendo, el dispositivo intermedio es un poco pesado cuando el valor no está destinado a ser historizado.

Por lo tanto, buena noticia: una nueva acción « Definir una variable » está llegando :slight_smile:

Te permitirá establecer un valor una vez, ya sea texto, ya sea un cálculo (pestaña « Calculada », por ejemplo {{ data.temperature }} + 2), darle un nombre, y reutilizarlo en todas las acciones siguientes de la escena. Ya no necesitarás crear un dispositivo MQTT permanente, ni el bloque « Recuperar el último estado ». Tu escena se convertirá en:

  1. Solicitud HTTP (GET)
  2. Definir una variable « Valor a enviar », pestaña « Calculada »: {{ data.temperature }} + 2
  3. Solicitud HTTP (POST) con {{ para inyectar tu variable en el cuerpo

Tres bloques, cada uno con un rol claro, y el cálculo sigue en el bloque previsto para eso. Es exactamente tu caso de uso :slight_smile:

@pierre-gilles Gracias, gracias, gracias, gracias :heart:

Buenas noches @pierre-gilles,

No hay prisa por responder :slight_smile:

Me permito hacer una pregunta sobre el cálculo y lo que devuelve: ¿es realmente un valor numérico entero el resultado de este cálculo?

Porque, en el registro, tengo este error:

Gladys | 2026-08-14T18:55:03+0200 scene.executeActions.js:42 (executeAction) Error: Error de análisis en la línea 1:
Gladys | …{{1.0.else.0.0.value}}}
Gladys | -----------------------^
Gladys | Se esperaba ‹ CLOSE ›, ‹ OPEN_SEXPR ›, ‹ ID ›, ‹ STRING ›, ‹ NUMBER ›, ‹ BOOLEAN ›, ‹ UNDEFINED ›, ‹ NULL ›, ‹ DATA ›, se obtuvo ‹ CLOSE_UNESCAPED ›
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)

Además, en mi llamada HTTP, debí perder una de tus indicaciones, porque el formato no parece adecuado: debe ser numérico.

Gracias por tu respuesta sobre el tema,

Buena noche,

Jean

Hola @jean_bruder :blush:

Buenas noticias: tu cálculo no tiene nada que ver con el error :grinning_face_with_smiling_eyes:

1. El error del log proviene del cuerpo de tu solicitud HTTP, no del cálculo.

Mira bien el final de la línea: {{1.0.else.0.0.value}}} — hay tres } seguidos. Son las dos llaves que cierran tu variable, pegadas a la llave que cierra tu JSON. Handlebars, por su parte, interpreta estas tres llaves como el cierre de una « triple llave » {{{ }}}, y se queja (got 'CLOSE_UNESCAPED').

Basta con no pegarlas. En lugar de:

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

escribe:

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

(un simple espacio antes de la llave final también sirve: {"puissance": {{1.0.else.0.0.value}} }). ¡Ojo! Poner el espacio dentro de la variable no cambia nada: {{ 1.0.else.0.0.value }}} falla igual, es justo después de los }} donde hay que dejar espacio.

2. Para el formato numérico: ¡nada de comillas alrededor de la variable!

Gladys analiza el cuerpo en JSON antes de enviarlo, por lo que:

  • "puissance": "{{ma_variable}}" → envía "22.5", una cadena :cross_mark:
  • "puissance": {{ma_variable}} → envía 22.5, un número real :white_check_mark:

3. Y sí, el cálculo devuelve un número, pero no necesariamente un entero: si tu valor original es 20.5, {{ma_variable}} + 2 te da 22.5. Si tu API espera un entero, puedes redondear directamente en la pestaña « Calculada »:

  • round({{ma_variable}} + 2) → 23
  • round({{ma_variable}} + 2, 2) → dos decimales

Buenas noches @pierre-gilles,

Tema ahora cerrado, y botón multimedia ahora completamente funcional para la radio y la música, gracias por tu paciencia y tu atención :folded_hands: