Interpolare și praguri
Interpolarea liniară LINEAR și comutarea pe praguri HYSTERESIS pentru maparea valorilor, reglarea intensității luminilor și controlul încălzirii în scripturile TapHome.
LINEAR convertește o valoare dintr-un interval în altul de-a lungul unei drepte. HYSTERESIS comută între două valori de ieșire cu o bandă moartă, astfel încât ieșirea să nu oscileze în jurul unui singur prag.
LINEAR
LINEAR transpune o valoare dintr-un interval de intrare într-un interval de ieșire de-a lungul dreptei care trece prin două puncte, in1 → out1 și in2 → out2 — de exemplu valoarea brută a unui registru în procente sau lumina zilei în luminozitatea unei lumini.
| |
Parametri
| Nume | Tip | Descriere |
|---|---|---|
value | număr | Valoarea de intrare. |
in1, out1 | număr | Primul punct: intrarea in1 dă ieșirea out1. |
in2, out2 | număr | Al doilea punct: intrarea in2 dă ieșirea out2. |
LinearType | enumerare, opțional | Ce se întâmplă când value este în afara intervalului in1 – in2. |
LinearType | Rezultat în afara intervalului de intrare |
|---|---|
DEFAULT (sau omis) | La fel ca BOUNDS. Pe versiunile Core mai vechi de 2022.2 extrapolează ca INFINITE. |
BOUNDS | Valoarea se limitează la interval, deci rezultatul rămâne între out1 și out2. |
STRICT | NaN. |
INFINITE | Dreapta continuă (extrapolare). |
Returnează — double. O intrare NaN dă NaN. Când in1 este egal cu in2, panta nu se poate calcula și se folosește în schimb 1.
Exemplu — conversia unei valori brute
# 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: 25Efectul lui LinearType pentru intrarea 11 cu punctele 0 → 400 și 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: NaNExemplu — reglarea intensității: maparea unei valori pe luminozitatea luminii
Nivelul unui dimmer în TapHome merge de la 0 la 1 (0 – 100 %). Această formulă reduce intensitatea unei lumini de la luminozitate maximă în întuneric până la stingere la 300 lx de lumină naturală; BOUNDS păstrează nivelul între 0 și 1 la citiri mai luminoase sau mai întunecate:
# 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 moreO curbă de reglare a intensității care nu coboară niciodată sub 10 % — o valoare de cursor x de la 0 la 1 se transpune în 0.1 – 1:
LINEAR(x, 0, 0.1, 1, 1);La fel funcționează și pentru ventilație: LINEAR(co2, 400, 0, 1200, 1) dă 0 la 400 ppm, 0.5 (50 %) la 800 ppm și 1 la 1 200 ppm.
Consultați și — HYSTERESIS, Rotunjire și numere aleatoare.
HYSTERESIS
HYSTERESIS returnează lowerState când o valoare scade la lowerThreshold, upperState când crește la upperThreshold și previousState cât timp rămâne între ele.
| |
Histerezisul filtrează un semnal astfel încât ieșirea să reacționeze mai lent decât intrarea: un termostat pornește un încălzitor când temperatura scade sub o valoare, dar îl oprește abia când aceasta crește peste o altă valoare.
Parametri
| Nume | Tip | Descriere |
|---|---|---|
value | număr | Valoarea măsurată, de exemplu o temperatură. |
upperThreshold | număr | Valoarea la care sau peste care se returnează upperState. Trebuie să fie mai mare decât lowerThreshold. |
lowerThreshold | număr | Valoarea la care sau sub care se returnează lowerState. |
upperState, lowerState | număr | Rezultatele pentru cele două praguri — orice numere, nu doar 0 și 1. |
previousState | număr | Rezultatul cât timp valoarea este între praguri, de regulă ieșirea anterioară. Nu poate fi Null. |
Returnează — double: upperState, lowerState sau previousState. O valoare aflată la cel mult 0.005 de un prag este considerată că l-a atins. O valoare NaN returnează previousState.
Exemplu — încălzire
Menținerea unei camere la 20 °C cu un histerezis de ±2 °C: încălzitorul pornește când temperatura scade la 18 °C și se oprește când crește la 22 °C. Într-o smart rule Script, întrerupătorul încălzitorului este atât citit, cât și scris:
# Te is the room temperature, Sw the heater switch
Sw := HYSTERESIS(Te, 22, 18, 0, 1, Sw);Într-o smart rule Formulă, rezultatul anterior este LastState, care este Null la prima rulare și după o eroare a scriptului:
HYSTERESIS(Te, 22, 18, 0, 1, IF(ISNULL(LastState), 0, LastState));Erori
- Upper threshold must be higher than lower threshold — la salvarea unui script ale cărui praguri sunt numere fixe.
- Upper threshold (X) must be higher than lower threshold (Y) — la rulare, când pragurile provin din variabile.
Consultați și — Scripturi în smart rules, Controlul umplerii unui rezervor pe bază de histerezis.