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.
| |
Parametri
| Nome | Tipo | Descrizione |
|---|---|---|
value | numero | Valore di ingresso. |
in1, out1 | numero | Primo punto: l’ingresso in1 dà l’uscita out1. |
in2, out2 | numero | Secondo punto: l’ingresso in2 dà l’uscita out2. |
LinearType | enum, facoltativo | Che cosa succede quando value è fuori dall’intervallo in1 – in2. |
LinearType | Risultato fuori dall’intervallo di ingresso |
|---|---|
DEFAULT (o omesso) | Come BOUNDS. Sui Core precedenti alla 2022.2 estrapola come INFINITE. |
BOUNDS | Il valore viene limitato all’intervallo, quindi il risultato resta tra out1 e out2. |
STRICT | NaN. |
INFINITE | La retta prosegue (estrapolazione). |
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: 25L’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: NaNEsempio — 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 moreUna 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.
| |
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
| Nome | Tipo | Descrizione |
|---|---|---|
value | numero | Valore misurato, per esempio una temperatura. |
upperThreshold | numero | Valore pari o superiore al quale viene restituito upperState. Deve essere maggiore di lowerThreshold. |
lowerThreshold | numero | Valore pari o inferiore al quale viene restituito lowerState. |
upperState, lowerState | numero | Risultati per le due soglie — numeri qualsiasi, non solo 0 e 1. |
previousState | numero | Risultato 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.