node-red-contrib-polygon 0.1.0
Piecewise linear interpolation with up to 20 XY pairs; robust endpoint extrapolation.
node-red-contrib-polygon
Piecewise linear interpolation Node-RED node with up to 20 (X,Y) breakpoint pairs, optional endpoint extrapolation, and strict monotonic X validation.
đ English
What this node does
polygon computes an output value from an input (msg.payload) by linearly interpolating between user-defined breakpoints. It supports 20 (X,Y) rows, each with a Use checkbox to activate the pair. Outside the endpoint range, it can extrapolate or clampâyour choice. Settings persist correctly in the editor.
Key features
- 20 Ă (Use, X, Y) rows in the edit dialog
- Strictly increasing X enforced:
- Editor-side validation highlights the faulty fields and marks the node invalid (red triangle) when used Xâs are not strictly increasing.
- Runtime guard: an invalid configuration (e.g. from an imported flow) is shown as a red status on deploy, and every message raises an error (catchable with a Catch node).
- Endpoint behavior selectable:
- Extrapolate (default ON): linear continuation beyond first/last point.
- Clamp: hold Y at the nearest endpoint.
- Exact-knot handling: if
IN == Xk(within a tiny epsilon), OUT = Yk. - One output:
- OUT â cloned incoming message with computed
msg.payload, plusmsg.n_bp,msg.segment
- OUT â cloned incoming message with computed
- Status text indicators for quick debugging (e.g.,
seg k,extrap,clamped,X order invalid, etc.)
Installation
Easiest: Menu â Manage palette â Install, search for node-red-contrib-polygon.
Or from the command line, in the Node-RED userDir (usually ~/.node-red, Docker: /data), then restart Node-RED:
cd ~/.node-red # or: cd /data (Docker)
npm install node-red-contrib-polygon
Configuration & algorithm
Let the active (Use â) points be (X1,Y1)âŠ(Xn,Yn), n â„ 2, with strictly increasing X:
- If
INis inside: findkwithXk < IN < Xk+1and computeOUT = Yk + (IN â Xk) * (Yk+1 â Yk) / (Xk+1 â Xk) - If exactly on a knot
IN == Xk(epsilon match):OUT = Yk - If
IN < X1:- Extrapolate ON: use slope of
(X1,Y1)â(X2,Y2) - Extrapolate OFF:
OUT = Y1(clamp)
- Extrapolate ON: use slope of
- If
IN > Xn:- Extrapolate ON: use slope of
(Xnâ1,Ynâ1)â(Xn,Yn) - Extrapolate OFF:
OUT = Yn(clamp)
- Extrapolate ON: use slope of
- Input:
msg.payloadmust be a number or a numeric string (e.g."21.5"). Anything else ("12abc","unavailable",true,nullâŠ) is rejected. - Faults (no output message; red status; error raised, catchable with a Catch node):
- Checked row with missing or non-numeric X/Y
- Not enough points (
n < 2) - X order invalid (
Xk â„ Xk+1among used rows) - Non-numeric input
Output (OUT): a copy of the input message with the computed value in msg.payload, plus:
msg.n_bpâ number of active pairsmsg.segmentâ 0-based index of the segment used:kforXk < IN < Xk+1(counting active points from 0),kâ1whenINhits an inner knotXk, and-1outside the range (clamped/extrapolated) or on the first/last knot
Quick test
Set two points and enable extrapolation:
- Use1:
X=0, Y=0 - Use2:
X=10, Y=100 - Extrapolate: ON
Expected:
IN=-5âOUT=-50(left extrapolation)IN=0âOUT=0(knot)IN=5âOUT=50(interpolation)IN=10âOUT=100(knot)IN=15âOUT=150(right extrapolation)
Troubleshooting
- Node doesnât appear in the palette: install from the userDir (
~/.node-redor/data), then restart Node-RED and hard-refresh the editor (Ctrl+F5). - Error "msg.payload must be a number": the input is not numeric (e.g. a Home Assistant sensor reporting
unavailable). Filter such messages before the node, or handle them with a Catch node. - Keeps clamping instead of extrapolating: ensure the Extrapolate checkbox is ON and Xâs are strictly increasing.
đđș Magyar
Mit csinĂĄl ez a node?
A polygon a bemeneti msg.payload alapjĂĄn szĂĄmĂt kimenetet a törĂ©spontok között lineĂĄris interpolĂĄciĂłval. A szerkesztĆben 20 sor ĂĄll rendelkezĂ©sre (Use, X, Y), a szĂ©lsĆ tartomĂĄnyokon pedig extrapolĂĄl vagy klampel â beĂĄllĂtĂĄstĂłl fĂŒggĆen. A beĂĄllĂtĂĄsokat helyesen megĆrzi.
FĆ funkciĂłk
- 20 Ă (Use, X, Y) sor
- SzigorĂșan növekvĆ X kikĂ©nyszerĂtĂ©se:
- SzerkesztĆ: a hibĂĄs mezĆket kiemeli, a node-ot Ă©rvĂ©nytelennek jelöli (piros hĂĄromszög), ha a pipĂĄlt sorok X Ă©rtĂ©kei nem szigorĂșan növekvĆk.
- FutĂĄsidĆ: hibĂĄs konfigurĂĄciĂł (pl. importĂĄlt flow) esetĂ©n deploy utĂĄn piros stĂĄtusz, Ă©s minden ĂŒzenetre hibĂĄt ad (Catch node-dal elkaphatĂł).
- Végpont-kezelés vålasztható:
- ExtrapolĂĄlĂĄs (alapbĂłl BE): lineĂĄris folytatĂĄs az elsĆ/utolsĂł szakasz meredeksĂ©gĂ©vel.
- Klampelés: Y az adott végpontnål marad.
- Pontos csomópont (X-egyezés): ha
IN == Xk, akkor OUT = Yk. - Egy kimenet:
- OUT â a bejövĆ ĂŒzenet mĂĄsolata szĂĄmĂtott
msg.payload-dal, pluszmsg.n_bp,msg.segment
- OUT â a bejövĆ ĂŒzenet mĂĄsolata szĂĄmĂtott
- ĂllapotjelzĂ©sek a debughoz (
seg k,extrap,clamped,X order invalid, stb.)
TelepĂtĂ©s
LegegyszerƱbb: MenĂŒ â Manage palette â Install, keresĂ©s: node-red-contrib-polygon.
Vagy parancssorbĂłl a Node-RED userDir-ben (jellemzĆen ~/.node-red, Dockerben /data), majd indĂtsd Ășjra a Node-RED-et:
cd ~/.node-red # vagy: cd /data (Docker)
npm install node-red-contrib-polygon
BeĂĄllĂtĂĄs & algoritmus
Legyenek az aktĂv (Use â) pontok (X1,Y1)âŠ(Xn,Yn), n â„ 2, szigorĂșan növekvĆ X-szel:
- Ha
INbelĂŒl van: keresĂŒnkk-t, aholXk < IN < Xk+1, Ă©s szĂĄmolunk:OUT = Yk + (IN â Xk) * (Yk+1 â Yk) / (Xk+1 â Xk) - Ha pontosan
IN == Xk:OUT = Yk - Ha
IN < X1:- Extrap BE: az
(X1,Y1)â(X2,Y2)szakasz meredeksĂ©gĂ©vel - Extrap KI:
OUT = Y1(klampel)
- Extrap BE: az
- Ha
IN > Xn:- Extrap BE: az
(Xnâ1,Ynâ1)â(Xn,Yn)szakasz meredeksĂ©gĂ©vel - Extrap KI:
OUT = Yn(klampel)
- Extrap BE: az
- Bemenet:
msg.payloadszĂĄm vagy szĂĄmot tartalmazĂł string (pl."21.5"). Minden mĂĄst ("12abc","unavailable",true,nullâŠ) elutasĂt. - HibĂĄk (nincs kimeneti ĂŒzenet; piros stĂĄtusz; hiba, Catch node-dal elkaphatĂł):
- PipĂĄlt sorban hiĂĄnyzĂł vagy nem szĂĄm X/Y
- Kevés pont (
n < 2) - X sorrend hibĂĄs (
Xk â„ Xk+1a hasznĂĄlt sorokban) - Nem szĂĄm bemenet
Kimenet (OUT): a bejövĆ ĂŒzenet mĂĄsolata a szĂĄmĂtott msg.payload-dal, tovĂĄbbĂĄ:
msg.n_bpâ hasznĂĄlt pontpĂĄrok szĂĄmamsg.segmentâ a hasznĂĄlt szegmens 0-tĂłl szĂĄmozott indexe:k, haXk < IN < Xk+1(az aktĂv pontokat 0-tĂłl szĂĄmozva),kâ1, haINegy belsĆXkcsomĂłpontra esik, Ă©s-1a tartomĂĄnyon kĂvĂŒl (klampelĂ©s/extrapolĂĄciĂł) vagy az elsĆ/utolsĂł csomĂłponton
Gyors prĂłba
Két pont, extrapolålås BE:
- Use1:
X=0, Y=0 - Use2:
X=10, Y=100
Vårt értékek:
IN=-5âOUT=-50IN=0âOUT=0IN=5âOUT=50IN=10âOUT=100IN=15âOUT=150
HibaelhĂĄrĂtĂĄs
- Nem jelenik meg a palettĂĄn: a userDir-bĆl telepĂts (
~/.node-redvagy/data), indĂts Ășjra, Ă©s Ctrl+F5. - Klampel extrapolĂĄlĂĄs helyett: kapcsold BE az ExtrapolĂĄlĂĄs pipĂĄt Ă©s ellenĆrizd a szigorĂș X-sorrendet.
- âmsg.payload must be a numberâ hiba: a bemenet nem szĂĄm (pl. Home Assistant szenzor
unavailableĂĄllapota). SzƱrd ki ezeket a node elĆtt, vagy kezeld Catch node-dal.
Development
npm install
npm test
License
MIT