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

Flow IF: Temperature e Setpoint su un nodo IF con condizione Greater
Il flow IF del progetto di esempio

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).

Flow Math: tre sensori su un nodo Math Average
Media di tre sensori con Math › Average

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.

Flow Range: Brightness % convertito da 0-100 a 0-255 per un livello DMX
Il flow Range: da 0–100 a 0–255

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

Flow Filter: Motion su un Filter con condizione 1 verso Turn on
Il flow Filter: passano solo le accensioni

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…).

Nodo Javascript Format kW selezionato con lo script nella finestra Properties
Il nodo Javascript con lo script nella finestra Properties

Lo script viene eseguito ogni volta che cambia un ingresso e ha a disposizione:

Nome

Contenuto

inputs

L'elenco dei valori attuali degli ingressi: inputs[0] è IN, inputs[1] è IN 1, e così via. Un ingresso senza valore vale null.

changedIndex

Il numero dell'ingresso che ha appena cambiato valore (0 per IN, 1 per IN 1…).

changedValue

Il nuovo valore di quell'ingresso.

setOutput(n, valore)

Invia un valore sull'uscita numero n (0 per OUT, 1 per OUT 1…). Se lo script non chiama setOutput, l'uscita non cambia.

log(testo)

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.

Ultimo aggiornamento: