Los bloques de transformación modifican el mensaje y lo envían. Sirven para renombrar claves, calcular valores, construir textos y decodificar datos brutos de dispositivos antes de Save telemetry. Cada uno tiene una salida out y una salida error. Ninguno de ellos mantiene estado.
Change
Asigna, edita, elimina o mueve propiedades del mensaje y de las variables de flujo o globales, en pasos realizados de arriba abajo.
| Setting | Meaning | Values |
|---|---|---|
| ops | Los pasos | hasta 16 filas |
Cada paso:
| op | Hace | Fields |
|---|---|---|
set | Escribe un valor; los padres que falten se crean | path, value (cualquier tipo de valor) |
change | Reemplaza cada aparición de from por to en el texto; los valores que no son texto no se modifican | path, from, to, regex (un patrón de como máximo 64 caracteres) |
delete | Elimina la propiedad o variable | path |
move | Copia en la ruta indicada en to y después elimina el original. El editor todavía no muestra el campo to, así que use set y delete en su lugar. | path, to |
copy keys | Copia cada clave de primer nivel del objeto en path cuyo nombre completo coincida con Keys matching en To object | path, Keys matching, To object |
delete keys | Elimina cada clave de primer nivel cuyo nombre completo coincida | path, Keys matching |
Las rutas son rutas msg., flow. o global. (flow.persist:x para el almacén persistente). Los campos del motor (_…), msg.msgType y msg.originator no se pueden escribir. Errores: invalid_value con invalid_path, read_only, invalid_key, limit (almacén de variables lleno) o bad pattern; los pasos anteriores al que falla ya se han aplicado.
Ejemplo: renombrar una clave del dispositivo antes de guardar: paso 1 set msg.payload.temperature en la ruta msg.payload.tmp; paso 2 delete msg.payload.tmp.
Calculate
Calcula una expresión y escribe el resultado.
| Setting | Meaning | Default | Values |
|---|---|---|---|
| expr | La expresión | obligatorio | hasta 512 caracteres |
| target | Adónde va el resultado | msg.payload | una ruta msg., flow. o global. |
7 / 2 es 3.5; + une textos cuando cualquiera de los dos lados es texto; la aritmética con null o con cualquier texto (incluso "21.5") falla con type: convierta con number(). Errores: invalid_value, type, div_zero, steps, limit. Consulte Condition blocks para las funciones.
Ejemplos: round(msg.payload.temperature * 1.8 + 32, 1); 10 * log10(msg.payload.ratio); clamp(msg.payload.level, 0, 100).
Scale
Asigna linealmente un número de un rango a otro, en el mismo campo.
| Setting | Meaning | Default | Values |
|---|---|---|---|
| property | El número | msg.payload | una ruta |
| in_min, in_max | El rango de entrada | 0, 4095 | números, no iguales |
| out_min, out_max | El rango de salida | 0, 100 | números |
| mode | Fuera del rango de salida | clamp | clamp (limitar), wrap (dar la vuelta), free (dejar) |
| round | Decimales | ninguno | 0 a 10 |
Fórmula: out_min + (value − in_min) × (out_max − out_min) / (in_max − in_min). El texto numérico y true/false (1/0) cuentan como números. Error invalid_value («not a number», o un rango de entrada vacío).
Template
Construye un texto, o un valor JSON, a partir de marcadores {{ expression }}.
| Setting | Meaning | Default | Values |
|---|---|---|---|
| template | El texto | {{ msg.payload }} | hasta 4,096 caracteres |
| target | Adónde va el resultado | msg.payload | una ruta msg., flow. o global. |
| format | text, o json (el resultado se analiza como JSON) | text | text, json |
null se convierte en vacío; los objetos y las matrices se escriben como JSON. Para la salida JSON, ponga usted mismo los marcadores de texto entre comillas: {"temp": {{ msg.payload }}, "unit": "{{ flow.unit }}"}. El resultado tiene como máximo 64 KB de texto.
JSON
Convierte texto JSON en un valor, o un valor en texto JSON, en el mismo campo.
| Setting | Meaning | Default | Values |
|---|---|---|---|
| mode | auto (analiza el texto, deja pasar el resto), parse, stringify | auto | |
| property | La propiedad | msg.payload | una ruta |
Errores: invalid_value «not JSON: …» o «not a string».
CSV
Convierte texto CSV en registros, o registros en texto CSV, en el mismo campo.
| Setting | Meaning | Default | Values |
|---|---|---|---|
| mode | auto, decode, encode | auto | |
| property | La propiedad | msg.payload | una ruta |
| sep | Separador de campos | coma | coma, punto y coma, tabulador, barra vertical |
| header | Decode: la primera línea tiene los nombres. Encode: escribe una línea de cabecera | off | on, off |
| columns | Nombres de columna, separados por comas | vacío | hasta 256 caracteres |
| numbers | Decode: los campos con forma de número se convierten en números | off | on, off |
| output | Decode: un mensaje con todos los registros (array) o uno por registro (rows) | array | array, rows |
El entrecomillado sigue RFC 4180. Error queue_full si hay más de 10,000 líneas o registros.
XML
Convierte texto XML en un objeto, o un objeto en texto XML.
| Setting | Meaning | Default |
|---|---|---|
| Mode | parse, build o auto | |
| Property | Dónde se hace la conversión | msg.payload |
| Prefijo de atributo | Prefijo de las claves de atributo | @ |
| Text key | Clave del texto junto a los elementos hijos | #text |
| Arrays / array elements | Qué elementos son siempre matrices | |
| Numbers | El texto numérico se convierte en números | off |
| Select | Conserva solo una ruta de elementos, p. ej. soap:Envelope/soap:Body/*/m:Price | |
| Root, Declaration | Al construir: el nombre del elemento raíz, la línea <?xml …?> | |
| Max bytes | Entrada más grande | 64 KiB (1 a 256 KiB) |
Se rechaza un documento con <!DOCTYPE. Como máximo 10,000 elementos, 64 atributos por elemento, 128 caracteres por nombre. Errores: parse_error, dtd_refused, too_large, too_deep, bad_name, no_root.
Hex y Base64
Codifica una propiedad como hex (dos dígitos en minúscula por byte) o texto base64, o la decodifica.
| Setting | Meaning | Default | Values |
|---|---|---|---|
| mode | Sentido | auto | auto, encode, decode |
| property | La propiedad | msg.payload | una ruta msg., flow. o global. |
En auto, el texto que parece hex (o base64) se decodifica y el resto se codifica; las palabras cortas como test o los dígitos como 2024 también son base64 o hex válidos, así que elija encode o decode cuando conozca el sentido. La decodificación hex ignora espacios y dos puntos.
Bytes
Lee números con nombre de datos binarios, o construye datos binarios a partir de números.
| Setting | Meaning | Default | Values |
|---|---|---|---|
| mode | Leer o construir | decode | decode, encode |
| fields | Una fila por campo | vacío | hasta 16 filas |
Cada campo:
| Field | Meaning | Default | Values |
|---|---|---|---|
| name | Clave en el resultado | obligatorio | una letra o _ al principio, hasta 32 caracteres |
| offset | Primer byte, desde 0 | 0 | 0 a 4,095 |
| type | Tamaño y tipo | u16 | u8, i8, u16, i16, u32, i32, f32 |
| le | Little endian | off (big endian) | on, off |
| bits | Un rango de bits start:length | campo completo | p. ej. 0:1, 4:3 |
| scale | Decode: × scale; encode: ÷ scale | 1 | un número |
Decode lee texto hex (se ignoran espacios y dos puntos) o un array de valores de byte en msg.payload y escribe { name: value }. Encode escribe texto hex. Error invalid_value cuando los datos no son hex o un campo queda más allá de su final.
Ejemplo: una carga útil bruta 00d7ff9c con temp (offset 0, i16, scale 0.1) y pressure (offset 2, i16) da { "temp": 21.5, "pressure": -100 }.
Decodificación de datos brutos de dispositivos
Un dispositivo que envía datos binarios llega con la única clave raw (base64 para binarios). Un decodificador típico en el flujo raíz, antes de Save telemetry:
Switch (msg.payload.raw nempty) → Change: set msg.payload to the path msg.payload.raw
→ Base64 (decode) → Hex (encode) → Bytes (decode fields) → Save telemetry
Compruebe el resultado con Test antes de desplegarlo. Para los dispositivos LoRaWAN, use codecs en su lugar; consulte Codecs overview. Para todo lo que los bloques no puedan expresar, use The script block.

