Funzioni: IF, Math, Range, Filter, Javascript
I nodi della categoria Functions del Flow: confronti con IF, calcoli con Math, conversioni di scala con Range, filtro dei valori con Filter e codice personalizzato con il nodo Javascript, con proprietà ed esempi.
I nodi della categoria Functions lavorano sui valori: confrontano, calcolano, convertono e filtrano. IF, Math, Range e Filter hanno l'ingresso TRG, che funziona come negli operatori booleani: se è collegato il nodo calcola solo quando TRG passa ad acceso.
IF: confrontare due valori
Confronta IN A con IN B e accende l'uscita OUT se la condizione è vera.
Condizione | OUT acceso quando |
|---|---|
Greater | A > B |
Less | A < B |
Greater or equal | A ≥ B |
Less or equal | A ≤ B |
Equal | A = B |
Not equal | A ≠ B |

Se entrambi i valori sono numeri (anche scritti come testo, per esempio "21.5") il confronto è numerico; altrimenti IF confronta i testi esattamente come sono scritti (maiuscole comprese). Così puoi usare Equal anche per controllare un testo, per esempio il giorno della settimana Sunday dal nodo Date/Hour.
Esempio — richiesta di raffrescamento: temperatura ambiente su IN A, setpoint su IN B, condizione Greater: l'uscita Cooling request si accende quando la stanza è più calda del setpoint.
Un IF tra temperatura e setpoint commuta a ogni decimo di grado intorno al valore. Per un termostato vero serve un'isteresi: vedi l'esempio in Esempi pratici.
Math: calcoli su più valori
Esegue un'operazione su tutti gli ingressi IN (con Add ne aggiungi altri) e mette il risultato su OUT.
Operazione | Risultato |
|---|---|
Max / Min | Il valore più alto / più basso. |
Average | La media. |
Sum | La somma. |
Subtraction | Il primo ingresso meno tutti gli altri. |
Multiplication | Il prodotto. |
Division | Il primo ingresso diviso per gli altri; una divisione per zero dà un risultato non valido (NaN). |
Absolute | Il valore assoluto del valore appena arrivato. |
Log10 | Il logaritmo in base 10 del valore appena arrivato (solo valori maggiori di zero). |

Gli ingressi che non hanno ancora ricevuto un valore vengono ignorati: una media di tre sensori, con un sensore non ancora collegato, è la media degli altri due.
Esempio — temperatura media: tre sonde di temperatura su un Math Average; l'uscita va a un componente Info per l'app o a un termostato come temperatura di riferimento.
Altri usi: Sum per il consumo totale di più linee, Max per la temperatura più alta tra più stanze, Subtraction per la differenza tra mandata e ritorno, Multiplication per convertire un'unità (per esempio kWh × prezzo).
Range: convertire una scala
Converte in modo lineare un valore da una scala a un'altra: il valore X0 dell'ingresso diventa Y0 in uscita, X1 diventa Y1, e i valori intermedi sono in proporzione.
Proprietà / ingresso | Significato |
|---|---|
X0, X1 | Inizio e fine della scala d'ingresso. |
Y0, Y1 | Inizio e fine della scala d'uscita. |
IN | Il valore da convertire. |
Priority Enabled | Se acceso, l'uscita prende il valore fisso Priority Value, qualunque sia l'ingresso. |
Priority Value | Il valore forzato quando la priorità è attiva (predefinito 0). |
Direct/Inverse | Se acceso, il nodo fa la conversione al contrario: da Y0–Y1 verso X0–X1. |

Il nodo non limita il risultato: un valore fuori dalla scala d'ingresso dà un valore fuori dalla scala d'uscita (con X 0–100 e Y 0–255, un ingresso 110 dà 280,5).
Esempio — da percentuale a DMX: uno slider 0–100 % comanda un canale DMX 0–255. Con X0 = 0, X1 = 100, Y0 = 0, Y1 = 255, il 50 % diventa 127,5. L'ingresso Force value collegato a Priority Enabled forza il valore di priorità (per esempio 0 per spegnere tutto).
Altri usi: un sensore 4–20 mA letto come 0–1000 da convertire in 0–50 °C; una scala invertita (Y0 = 100, Y1 = 0) per trasformare l'apertura di una tapparella in chiusura.
Filter: lasciar passare solo un valore

Lascia passare verso OUT solo i valori uguali alla Condition:
Condition = 1: passano solo le accensioni; gli spegnimenti vengono scartati.
Condition = 0: passano solo gli spegnimenti; le accensioni vengono scartate.
Esempio — solo accensione: un sensore di movimento accende una luce, ma lo spegnimento deve arrivare da un'altra logica (per esempio un timer). Con un Filter a 1 il sensore può solo accendere.
Javascript: codice personalizzato
Quando i nodi pronti non bastano, il nodo Javascript esegue uno script scritto da te. Ha un ingresso IN e un'uscita OUT; con i pulsanti Add aggiungi altri ingressi (IN 1, IN 2…) e altre uscite (OUT 1, OUT 2…).

Lo script viene eseguito ogni volta che cambia un ingresso e ha a disposizione:
Nome | Contenuto |
|---|---|
| L'elenco dei valori attuali degli ingressi: |
| Il numero dell'ingresso che ha appena cambiato valore (0 per IN, 1 per IN 1…). |
| Il nuovo valore di quell'ingresso. |
| Invia un valore sull'uscita numero n (0 per OUT, 1 per OUT 1…). Se lo script non chiama |
| Scrive un messaggio nel registro del server, utile per controllare lo script. |
I valori arrivano come testo: usa Number(inputs[0]) per i numeri. Le variabili dichiarate nello script restano in memoria tra un'esecuzione e l'altra dello stesso nodo, così puoi ricordare un valore precedente.
Esempio — formattare un consumo: da watt a testo in kW con due decimali, per un componente Info.
var w = Number(inputs[0]);
setOutput(0, (w / 1000).toFixed(2) + ' kW');
Esempio — segnalare solo le variazioni grandi: invia la temperatura solo quando cambia di almeno mezzo grado.
var t = Number(inputs[0]);
if (typeof last === 'undefined' || Math.abs(t - last) >= 0.5) {
last = t;
setOutput(0, t);
}
Esempio — due uscite da un ingresso: da una potenza, un'uscita booleana "sovraccarico" e una numerica in kW.
var w = Number(inputs[0]);
setOutput(0, w > 3000);
setOutput(1, w / 1000);
Ogni esecuzione può durare al massimo 250 ms e usare al massimo 8 MB di memoria; le funzioni ricorsive sono limitate a 64 livelli. Uno script che supera i limiti viene interrotto e l'errore compare nel registro del server. Non usare cicli d'attesa: per i ritardi usa i nodi dei temporizzatori.