TapHome

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.

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

Parametri

NumeTipDescriere
valuenumărValoarea de intrare.
in1, out1numărPrimul punct: intrarea in1 dă ieșirea out1.
in2, out2numărAl doilea punct: intrarea in2 dă ieșirea out2.
LinearTypeenumerare, opționalCe se întâmplă când value este în afara intervalului in1 – in2.
LinearTypeRezultat în afara intervalului de intrare
DEFAULT (sau omis)La fel ca BOUNDS. Pe versiunile Core mai vechi de 2022.2 extrapolează ca INFINITE.
BOUNDSValoarea se limitează la interval, deci rezultatul rămâne între out1 și out2.
STRICTNaN.
INFINITEDreapta continuă (extrapolare).
LINEAR function graph

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: 25

Efectul 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: NaN

Exemplu — 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 more

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

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

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

NumeTipDescriere
valuenumărValoarea măsurată, de exemplu o temperatură.
upperThresholdnumărValoarea la care sau peste care se returnează upperState. Trebuie să fie mai mare decât lowerThreshold.
lowerThresholdnumărValoarea la care sau sub care se returnează lowerState.
upperState, lowerStatenumărRezultatele pentru cele două praguri — orice numere, nu doar 0 și 1.
previousStatenumărRezultatul 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.