TapHome

Interpolazione e soglie

Interpolazione lineare con LINEAR e commutazione a soglia con HYSTERESIS per mappare valori, regolare l'intensità delle luci e controllare il riscaldamento negli script TapHome.

LINEAR converte un valore da un intervallo a un altro lungo una retta. HYSTERESIS commuta tra due valori di uscita con una banda morta, così l’uscita non oscilla avanti e indietro attorno a un’unica soglia.

LINEAR

LINEAR mappa un valore da un intervallo di ingresso a un intervallo di uscita lungo la retta che passa per due punti, in1 → out1 e in2 → out2 — per esempio un valore grezzo di un registro in percentuale, oppure la luce diurna sulla luminosità di una luce.

1
2
LINEAR(value, in1, out1, in2, out2)
LINEAR(value, in1, out1, in2, out2, LinearType)

Parametri

NomeTipoDescrizione
valuenumeroValore di ingresso.
in1, out1numeroPrimo punto: l’ingresso in1 dà l’uscita out1.
in2, out2numeroSecondo punto: l’ingresso in2 dà l’uscita out2.
LinearTypeenum, facoltativoChe cosa succede quando value è fuori dall’intervallo in1 – in2.
LinearTypeRisultato fuori dall’intervallo di ingresso
DEFAULT (o omesso)Come BOUNDS. Sui Core precedenti alla 2022.2 estrapola come INFINITE.
BOUNDSIl valore viene limitato all’intervallo, quindi il risultato resta tra out1 e out2.
STRICTNaN.
INFINITELa retta prosegue (estrapolazione).
Grafico della funzione LINEAR

Valore restituito — double. Un ingresso NaN dà NaN. Quando in1 è uguale a in2 la pendenza non si può calcolare e al suo posto si usa 1.

Esempio — convertire un valore grezzo

# raw register 0 ... 1000 -> 0 ... 100 %
LINEAR(MODBUSR(H, 10, Uint16), 0, 0, 1000, 100);
VAR raw := 250;
LINEAR(raw, 0, 0, 500, 50);
# Result: 25

L’effetto di LinearType per l’ingresso 11 con i punti 0 → 400 e 10 → 2000:

LINEAR(11, 0, 400, 10, 2000, BOUNDS);
# Result: 2000
LINEAR(11, 0, 400, 10, 2000, INFINITE);
# Result: 2160
LINEAR(11, 0, 400, 10, 2000, STRICT);
# Result: NaN

Esempio — dimmerazione: mappare un valore sulla luminosità della luce

In TapHome il livello di un dimmer va da 0 a 1 (0 – 100 %). Questa formula regola una luce dalla piena luminosità al buio fino allo spegnimento a 300 lx di luce diurna; BOUNDS mantiene il livello tra 0 e 1 per letture più chiare o più scure:

# Va is the daylight sensor in lx, the result is the dimmer level
LINEAR(Va, 0, 1, 300, 0, BOUNDS);
# Result: 0.5 at 150 lx, 0 at 300 lx and more

Una curva di dimmerazione che non scende mai sotto il 10 % — il valore di un cursore x da 0 a 1 viene mappato su 0.1 – 1:

LINEAR(x, 0, 0.1, 1, 1);

Lo stesso vale per la ventilazione: LINEAR(co2, 400, 0, 1200, 1) dà 0 a 400 ppm, 0.5 (50 %) a 800 ppm e 1 a 1 200 ppm.

Vedi anche — HYSTERESIS, Arrotondamento e numeri casuali.

HYSTERESIS

HYSTERESIS restituisce lowerState quando un valore scende a lowerThreshold, upperState quando sale a upperThreshold e previousState finché resta tra le due soglie.

1
HYSTERESIS(value, upperThreshold, lowerThreshold, upperState, lowerState, previousState)

L’isteresi filtra un segnale in modo che l’uscita reagisca più lentamente dell’ingresso: un termostato accende un riscaldatore quando la temperatura scende sotto un valore, ma lo spegne solo quando sale sopra un altro.

Parametri

NomeTipoDescrizione
valuenumeroValore misurato, per esempio una temperatura.
upperThresholdnumeroValore pari o superiore al quale viene restituito upperState. Deve essere maggiore di lowerThreshold.
lowerThresholdnumeroValore pari o inferiore al quale viene restituito lowerState.
upperState, lowerStatenumeroRisultati per le due soglie — numeri qualsiasi, non solo 0 e 1.
previousStatenumeroRisultato mentre il valore è tra le soglie, di solito l’uscita precedente. Non deve essere Null.

Valore restituito — double: upperState, lowerState o previousState. Un valore entro 0.005 da una soglia viene considerato come raggiunto. Un valore NaN restituisce previousState.

Esempio — riscaldamento

Mantenere una stanza a 20 °C con un’isteresi di ±2 °C: il riscaldatore si accende quando la temperatura scende a 18 °C e si spegne quando sale a 22 °C. In una smart rule Script l’interruttore del riscaldatore viene sia letto sia scritto:

# Te is the room temperature, Sw the heater switch
Sw := HYSTERESIS(Te, 22, 18, 0, 1, Sw);

In una smart rule Formula il risultato precedente è LastState, che è Null alla prima esecuzione e dopo un errore dello script:

HYSTERESIS(Te, 22, 18, 0, 1, IF(ISNULL(LastState), 0, LastState));

Errori

  • Upper threshold must be higher than lower threshold — quando salvi uno script le cui soglie sono numeri fissi.
  • Upper threshold (X) must be higher than lower threshold (Y) — durante l’esecuzione, quando le soglie provengono da variabili.

Vedi anche — Script nelle smart rule, Controllo del riempimento di un serbatoio basato sull’isteresi.