From 789da2852168536b1d8866bacc9bb391a4ecb155 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Penas=20D=C3=ADaz?= Date: Sun, 18 Jan 2026 00:00:58 +0100 Subject: [PATCH 1/5] Create Changelog for sensative-strips --- sensative-strips/CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 sensative-strips/CHANGELOG.md diff --git a/sensative-strips/CHANGELOG.md b/sensative-strips/CHANGELOG.md new file mode 100644 index 00000000..5bd0c487 --- /dev/null +++ b/sensative-strips/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 1.0.0 - 2026-01-18 + +- First version of plugin \ No newline at end of file From 39834043d9a122e77591b3a2aabf95b5a1f95ae4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Penas=20D=C3=ADaz?= Date: Sun, 18 Jan 2026 00:00:59 +0100 Subject: [PATCH 2/5] Create LICENSE for sensative-strips --- sensative-strips/LICENSE.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 sensative-strips/LICENSE.md diff --git a/sensative-strips/LICENSE.md b/sensative-strips/LICENSE.md new file mode 100644 index 00000000..bffeef34 --- /dev/null +++ b/sensative-strips/LICENSE.md @@ -0,0 +1,7 @@ +Copyright 2026 Thinger.io + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file From d5c5652f3c6bbf45395e525f0e40654b21680706 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Penas=20D=C3=ADaz?= Date: Sun, 18 Jan 2026 00:01:00 +0100 Subject: [PATCH 3/5] Upload image sensative-strips --- sensative-strips/assets/sensative-strips.png | Bin 0 -> 57080 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 sensative-strips/assets/sensative-strips.png diff --git a/sensative-strips/assets/sensative-strips.png b/sensative-strips/assets/sensative-strips.png new file mode 100644 index 0000000000000000000000000000000000000000..de15ba341bb43850c1c652378aa66bb03c365fb5 GIT binary patch literal 57080 zcmXt91yqyY-ybLzwn#`RJyN<$x;sWH4I`vGOu9x%D=9FBG#h2nQUeBzl4c+vF-G$~ z^Z$Ey4sgymXV2Ze-}uD$M(b*;+`94T1_%VYrKYN=4+4?e5Pz;+0p77QMyvpTuD?`; zc!NN0Fgj^xxm?b0;jtH4~P%Bm?7B(X-HP8x4o55d@OcJJ}{zi!_9M+H>iN-w>KrN9lCG>c-+b20=_6I|xH797$_GP{C;l&23Ev8G^qN`a7`}HcukNb1q2weeo zLrngQ3@A{DO1Gy^nOuU3RO6BcrBy&Dr1V#+_v26foS~}&SO5RJff$X1G$NKe zlh^Aa{!CA>ZZUzWrvztF1N>bS~HV$H_m2|uRPLRZ8F$?ufB%p1Il zPy?R)J1)SG@4|@3-Er~)l307AB5t)FjgYtv(h)jbCV8B=;y!F4%wS?L&}th>=nhDp z);nEZ_pNqzlR66=oLtP>$Ec483=Uqch=>{ ziG+7H$cd6s9nWShU%g!4FwVbA#5IE=1m~rimj@Q96TRp_phMLNt#*>`6mqeQX>DV7 z9-Uk}r6fCHnx0;Ve!h%~n72Vz%5bZi^E5kGovz`|8ZS%8-bkmpin*H=l8lyhQ6n_S zJJcCpOn5(@g1$n@4}87Eho-Oo?Jt}D{iyBD(vz^fR3WaRbGW_NW@&&9fn=e*qWG;jIqNqaRS@z!B6uz&bqeQwzKeHLmiYY09 zyz}uVg7)se3$FtI1c5MDQb}|7*3LPrSys3|AO(6PmX^5@^xFoty2}HOmWv?J<>&V< zJ-*Yp;w0Xt?*-ZQ7XMneofYRe0J~W=zEXl;to{|qV^fT*#PpBK?Xzn+sA~%YpZk3C zcU72fuS6b=ls_mW?kk@V5LfN&R{nA9Nyxfs!CAvhuy?A35fYiRjD(OZThR=j^^-L} zz+paFfKJN=@{pAV$|tu$&!5LKgF;k!1)0*SOOym7xg~I(}sGCZv zq%4$fb^z8>pMubc)+AVZ52jhw(m7U!XzbPJsZ`yhcnT~CO2(IN&k*^}{f49OHs;0I zH*d194{pE4lW;KCzgHzWOuy;TSLtkak+)O%F+B06?A2{C^pTT2P;Tj9zMk|r!!wPVf>=jGAT$mg6WDJ15Rntl0*#u&INfCa8c3yS0apiY!9jKw0h>* z%X;v6V7V}?|6>#h2qY%Rp!9M#(38ZBUvGoXaYmrxr)HpCsnjLoo0FV7_8TAiBoMTq zuh)Tfbr&N018B7d7H#&HP8Ym;#7@pWc~3XV?LxtX|JXymy19a zS4MZ6pTSBAGOjpKGx?R$P2fxadmW0+`<}ei=z_#8CYMbljt*pPqwEgpglN>-43#BK zDy?T_*bC1B?BV?NGWBiathSc4gMm8@Akd}D8<&zwz3Y9t==DL(ONi=eb=C?@0DZo# zcFE;_`i?HiSWgB~?02%h_?%wYkT!Hfnt*ofcY)?AxYPC1`*SU0q%- z>hH)}lvvGg>lW>9;0^4m!|tH6&Qjx;`Ik||DyWIukdmGQRd6OHosaD>f$B|f9&b@?U{dzyrMS~);)Y>GjYXg(N@(S_Prxfa(ScaOx#sg2V&mm zV$VY{Wamw(Utv)`(z(lR^ScH^8e1ly+Y5S1Jg~en#E&xf&xY?4tH4SvuIpl0a!ffN zJy$$4N=~s^ao^|Ke6I#ytIwu}^(lVUI%KB<`sqe?b%GH+w0r}Fpo;CVss5;BIUYMQ za=f%(2fT6Y<7t+k$GhIKP$wfT?$(x{gJCaa$K!C$p>Xh5dYz@vL_4 zB!2ENzG|k)b5U@w|H!>awK_qO0$c)1=IB&Sw%JQGxwhClUzk7vZs;0i=%NPJ305w* zg>U@$@#9VY*`HO}^Ay>mlyE}$Y5v7YqmGVFxV+-FUSTRddcr<%7QqbqZ3_aPzq`b( znDvXI;zO5~69iGxt?G@L)~M(%O8;V6@b^#qA>&2I_UXLr(e_2acJC}-hlGAn7Ae^c zqmP`I=dC|aaG1#-mul$tqRSgTBdC0WP#;H9$apA)m6*z@e9vaK!w7sAYl#ajLvai^4OV4dh4=kK((sy|=LcKX@A}=Fhdn6zZxqFvD@Hemzb>xaZi`M5J z7rX68T^EP#C;6*;M}DqaCPqejMn)8hN*V>p&<^nBqX0Edj89OIdSqmzPlyjX<6cqKtbClCV^A@7Z2%|wknT2Nj9F*PFFL6wX) zUHr+bZikM?%stCt`ZR+UNV@#sEh%{ZC=7NWSXI8>*?w+vu^t|DFzI+<<#?3U?;w=j z-$@Cl4koKOiRND!OS@}ESk_nCol^#re=2Y>9tL97R)$=WukCO_qpI})d*@Yn$wTyxm0UwYhfEPgr>eNep0jGv=dpt{zROi`_=FSZ=&>sJ(@qo^a~B zU>`4s2vD&MHhfZ2Fd5mOlf-p8ki}M;t(@?13MOo zj_j%>hL1F)W%;MK=t zB%qtX5&tgS_qWe&H#a!0u~UZ!U}8sYcT8)dEKxp3SMJrvjMey!RRysWP(Qlm3W21k zrfVb|-*$Fm1dH5ucWH0j8j1&AgW>b!e7Y&Pc5kf}c*ZRBMb8R%l7)7&Y@YaXCpa_G zft3toH_1pOMy!Tt6CD&KGKZDct z?k!IfVUS?+hH~%44Ni z=z3H;8KIu7WoOZqQEO$c^rk@{Cm7M{it9 z<;J(2x_a)4;xn@|XaKx)7AX(p0VswV6zGNcoB+$n9&KDAUD!*S4iz^k6iPQv_ZCm< zj-IoP^R3dYf28YF509UW3)@Y}AIiVzupYwUz-POCd?Sw5f$tF3?Fin?xa#Wn9Yy(8 z`1R==jU9VW3yNpW;mb+th2=p?zr1Hzx0Dk^56bKEVJG9m(i(YtHDOdBkT$V6IMO4O zJgoC-%G?IXsuS=|Z?+U^Bqd}@!U@|K(wp1cBOx-S+bzeOKrBTc@LHF|Lo&j%xQt#L zdT83VccRQ0Q!rQ0_a?qPy`R-zUR$@NiBs_wL}YuP`~m&-yd3@w^jm>kbp^pynLC;| zO68HCvh&MiW6D+@vMlveywh}CF&+w=YTBA3VYMztn3%P;J`(OpNZ_Qb?5iVo1~7 zU!}kDxPFHt4x{03Xwqd$Fjr^#{zFtd)G2Dk+Wz-`MW6OA%Xz{xz$ zj-h5=4|xc-cuOztP!HRmC{2QG`D9$%@mLjlZ%|fe?!Pqh=`*Rp`iJ+T+>eINLp5#BiZ(h2rTr`6!RxKEd7c2q@=HUfo8}7X*ld!3 zNTZ11Z`V_^j;vR!E%@8u96YNMBl6zv+rl!oh0_=j&zA;S{m?tAXc;&0rBzp@G{>?v zDDC|Bo%09=nGn@%T3Vs}K`^FFl7F93K8i%+I!v;bhUdrwRb_8N4FE(xE3;gmJ7^KK zZ{wDZ_WQ&qJ;8SMo`?Jy^NZ?$2tw?xj}s3BhR@emjqg?PZ8ncZ8s}#ZQe;|KR%@oT zF&#+Wi}(3RU50>`m&fp0H4Qy#@63MHB{q9%?yq&_2_?4{9os5z;ZWSXkCuyXF#%o_ z)+=`3pcAvi`tGheHR$#~(q>N+FuEAL`X%O#2HB0%# zWb|30nQE>fDqa0j?RV$5cR!bNZd%lBoBbJ2d7P3$2IBY%z@s}o@dl*+CV^NNcc%VZ znFBhoT05^BX)At=eWaH? zydu#ycmmB7(W#li;xjf--^^g#YRuMS>U)aZi>vLOE{VIudNbnszkOLw2S>jFdyZ*( zz6jcoc4w>7sPJ)(NnV#x=JM6*oTyM;+>9~(W3qvvlcXvfN)K0`!}3mArM}{*k5XG@ zOVje~sQkhD2X_IVdHYg<^yxifkPVYo1-2Tqll_8H@~Rm>QprvcNnkCE@9HbEJ$LRA zx-_oEz|R1mgVb{vQk2W#ZRC?bPtJ1O>PUR0-?bD_Q6Nd zEyZ}5dZmamLdK+XS(s}r)l(>t;|0i$h^T4usEoDq)%(yY zd2?PBzUQ%4**IHJUhcHLYhO?m@=oR?(^7pTD4wF+PRAp!rC@4QwJwrhV?wM8T2x++ z3TG@9lf;E+SfG%Os+`t%WbG2;>NF^z06@ud4E^>QVO~On#~JLO+J5GOmIwav!4e|5soK~l&R`6zRCx8r`@dzRG? zIij*6*}?3sahDEHj8f7y^d-U*$@*c#3ErVgzXj4Yh6S~Iyf1g$1YIJYU$uo712QLA zx0W}xNzfahshWW=DEme|qwYcB`qdg#@<46K3*8b&g}-NTsSU`M!E1g?nBrOyji%NfwM zvya{$mcKSTxWFr6(>wSRQX z4^6iU+UaPJpL(iR!MO0dfX>x6xpRZF>w^AjBr9!1Ef|dBLV2eq1VXkR?QUnCOg$Q3 zH_x6zlipaJ_KIm@yF^a&KX}L7s$0@#QPLzNy`}46o(Qe^IcCUh&`4Q5@I{!#H=bf@ zltR>FwkTWFh$5N#*CFUXz;+bQ=dWvFn!6|0f!Fsv?zK3eETg&cjF zIpEN>3o^VGzuO_0!ap^xs<-%(HupZW1B7n;okOlvh3BDX8N8GSBu7H*`P}xO6$9r( z??Y3(dCV4Fc>C|uR9ciTdavTk%_|dn%GF*3e=5c&Jh_RfdK$9N#Qi5vCB8VJhvV|0 zX!U8Ih(IJ1T@jbcDaAUN>8J^%bNfYC@#_{S2>>w>QpmK(EPLof6YYU9$9R(k-cgGe z1{NO>o;EeBqH_yTPP!$^yd84!+x)kh@4Rxmshx_gdp~^~oy)BpV{x<*NnILJ`Fbsj z+jGigb3k7?Mb<+A6hTRh<9W&_Wm1Ii1NF5Qi3}A+yhG+$DeO-nAZ7 z4_G;Ua#D!=(KNB>4Pe?Tm)7<2*eGVs{K&u zc(hbzYzZGDMVD{5VVsnZ($Kl0Lcu}HoNmQV9wyCL8fQndNI2wPy#l%`m&6JR)NeHG zXahu86&HnfHO?nkCrA2KI~MUU`ojq9t5^4Pw?iTu8XBA&9V2H$ z_OwvG8@IjT$*$!6_EW9cuxpjrQV4?uF@P)nvoy#sIWlunsgPY{R@FypeguP`j1($YtcWQ5HTuQIDr*+i`{x%>~0r4cj!lgHWE$-34 zqp8a@dTNZ-1hRzRXEuc_7&^9UuuISmwb5(yR;#-eNTV63rG|}R%dVUJj6V=kvQUK84 zQu0q(T2FWTgeo|V?v21-^rx#iYkqkCQ1Ekk`3;4bn_+o4&uDutf5zel1_)0Wzfrok zfWbiJQV3x7095fX;5!fPhL>Zpsr+%dE4?i}GW-iq6h9ikzExrP3Zgpj! zHejRhraUmPff`wrF;#A(d9|RIa z{LAlRvc-QBE@X1^|ch z@lkB1;=8X`80F^SK{#W`&lx(;m8=U6Qa3p`u$X${i`R<#fZAz%xSH1N{^)e_Z$tgc zD!s}&A7MI8h7klJ`G=KKOZS!f)7Z51M&KMR+BFg{)$NM{_l|W-I~J24rhtA#;qPPmtF$U(1n$1HZZcTuFb9w{kkN z_)+wSKAcsGR$`XiS$X+S>gs86=(urtt(`{K4hFIqz|%s{;4hpC_@G2q-1Q(X4|P{# zS*S0Q1=_E3l4pZAuaWyIm@ei=#hkwNQs|GUnu3=}jAFIM!6RqFf>O}Smva7Fv&H08 zya1)FYi-r?--ieZ@J+R6^I5wK4~4nc?A9U9K*Y?b-9`=7B@#*DNDV~cKl5HVp8Wb2?* zo2wMC((#>Hx|f1hx#=!nKzxeicAH=f`P9@@Aqs&5Shb>JD}Li}E$Vh+f|IT78xawa z&k4y}(?|t?3GN$0Z^e%OjBQQ1yjS7g>yY2ed6Tl*!Xk}Quo&{aZhHf^^V4(Lrnx9E zwf8qMN&&y|@2BFZFE&N+FnA4mJ5k+%K2$%>m&c*_qa43t!Gx=%;ka;aULLx6yH$mX z&#I`kFT+_Te`ITmcgABTWv^cgV1>X^jt`#}D9=ksOBd6QR~bAcrKe{cIX?&RFXIT% z+#yegemMxeng0Umm^AyzvW#5vj?omBUxBZR6o;Gkfw}>t17fVWq5~B$)#Gj@$t=@OH53tm-D1Nl;kKtbhm7J`D$fPd}em86!;ggX2hS(;f`1;TBX>ig>L!G zyV*u5X>=7;tv*u!KMOFpo$b?x6$Uc64Nxbn!d2$77Ld1T08@kr`HH^UZg!M_xqf1y zBxp<@gezkKNcAs53B`9)J7bX3x}grCuXwH6rxvQqIkCX$#WpwBwYSe*-tcf62GF~7 zz~2bUSh7vaHcjAcfi6eHLcr2u_|YpXY^`Sll69usPX7KGK>r=}V9~ClWA9`>xEELT2HRr=3-B4ihyeQ3{~Af@PqI~CNIIu@o>$+y zrOZf^uyRc$MMJ*z;o~OZg_2&7AU>%dsE)`jPs7kfJbH zfu;GZh`)8EALfH`pnFJ9)>VL2-vnCo-$G=(x<%aT-Da5UXdnDdjmTZME1w0`s0ru z3KCLMMZk*9xG5=~eI%EZJPU(8$yMCb>o3owU{06Z&XF944O_GrGh!{^63_$&8l7<1 zO~4-|LTs3%y4Q7Qglw5?BG=&NmN~OQXYKSCjSmPlChX*F32{??6fzT^02~l8nv9H; z0FnoYj}z=K-A)Sg+wqi^6O*5y7H=77dUBnR%B&DKUL3y%6v@y!xK|kFPIA~y`fqK*uitKG z{YgblPl%WF7A>a7Empr4LiCs#P<`qUobl&32g0YWwRQylF)leFArZIsHwnncwS zI^p~g2k7Q8Zlh|1(0&mLM19!mhIJ`WTbW!Aa;1PWo4e^o~IXsn2+2**sfq`t%} znQX`dM#?CdQ)oZ_GX!>sS4+05gF3{gGLdX@{cA!F*tsOXvd9!+I(q|+NcwiUuSvSs9~dkRw_;-yFk~- z?PivzmH5VI2k^qOcr2`VXxXkLjycycI&SnfAmPSRgTm^lVh><23yr)mtymb^I@*g3 ziIGCEhVjB!xkcy945EU94J}80V2*u#0#v)$*(q%Q%*2>fS-HVqxXHGk_O)wDN=g#- zK)?K;a=!56vQoe*yTd3`6zRVuwD@+Yi4719gQ2l2Zj|Q@UPAf68wRXD3ty%(R5i~8 zroOWOkMx5BlbyCS68p-FE~aBdw$%6bGZ|Jbs?(eMSw#44%DsXDd=wjJ!}FuE;#>2> zj&U-kvW5>kP$fSK3s-`#8NQR_Ydy4?3bZ`}0u&(Zs1V$J%Ql~~Ia1sUT6lN>P|wI; zSp}RQeLH3=dXU`{{Zq(Z$iJVJP^t1h@yAIP(~o7wu_F+On&^VqLSB1Oe#s#NuSzVa z$F4jYP5O8n5FeFa`j2%XYs?9fjdlR8%qp9UZZK1H~NhSccJBme>P&aZ>@9$*B4feM~z@lk_IOyQ%$a8bb4Y10yF zIe`ZW#tgvt2Nyy)kX!bth>o}Q(@Io&OF)Ah=n zei48ViIj`UNEA$MQYr!Xrmh;P2GAu#K1$%>jdOvK4J+O#&&4YM;L!uhymgxi&s}OJ3Eaqdeox z8P(GtFm!d)Ts@ngdz^eRrr2p#8Y^u@#n_->Mhywm!jEJU0RRXw6I}w@Ef6lz<>dua z08$$lCbkWJ<>L;%FnOXPLfoj?pbeg&1ArppO7lyAI=!F$&blQa`G7!hZlCer1-`37 z!?7v2L#-A`lgfRS( zF;N^CTa(A^4Hvon4s}SRT5ty6NK1b~xKD^Ck@k)n=nSu{IMmJ%+X2uVv~{%C&Iog* z)XdWOQ3D?UN&yJ7?(9#k(A;zpk@3H|dS?wdg+gie6#25gCm2m0UEvc|6dMVM@k!0A zdQilyFe`+VvoKyo`B5Kd3O6M%Z$jtXmcFc+(o?@tw(+i@J5DrzdUE!YV_sm14*$Jq zr||H6V1G1pWVI9(8{KCBrEzUNjmrm*6+Zs^;|}gyB%}W0g4R}PB1j1)Y!h0yfzTS9 zZW`X!6MvLdMSty;Lk*JyB)P~@4$9SII+&!QT%K~go0BNQSXSv60*U~IsR0%wyR1GE z)5**nZ=dD~agKv|)*Y>M*4b%lJm*=u#|*RSuz8?}X^;hq>*As=3+cvl~u zj)yzVjeE)fxC21chuvq00NW7t<5aAR@vSo1J{Z5R6<427u$FR+kkyw7M#96~%<}o! z*5H1t6t^2O9X9ff1Ol!%jVrz$N?bw18m7{`b#!*tiaGe=Jm4v#(ZiooHZCVt!t&5eH#bM#l-_Z>jSlVWpUN^Xy9u`eQU4RPDWGq!_V^lN z+s9ioE4VzZgOcnx3kH~!HINo6l-1|nFDbn2*IUgSIXWkrS)!v5md(mQT8qrIhvx&C zqe)@ge!Z!;TVKS_dcc8J+@3{x0C@=4xic#xp6s4)v50xZ$&t+ zS@`N;%TWtP_)gWYDC0X7U|m)>uF;NPUA#ReD8T>^5$5C3{_Oql$Ws<|6y+M)7@jmbl~^+zD7zf}BpW>@oD;9lLPp#dvj6NNWEu(0<8Z?p)sdQsWZ`4sJZ?=JbQ@p8_r z_`U7H54FC)*0Q%a-!c7_@g3yQ?%A^2C_>Hu%xuxgd${*VEbkU&>cp^s}+3Qi<#~3bA27!(KFRtynbi72Z_kv)DTe7r80aB$=Yc zn{wW15JN%A!yZP@q2~l&WpZ@xo004j#syw!dWR`*TydcPA@QFu8DOb~_SfheUcVb1v8)`FZS#i*SBk87z>*d?=$ErN}?Fdq1yuVxnjOgA1foT55l74kr3X9Yy ze@!6p)F&))yS8WzxD>YE-oE0+A+n9wz@Jh#k}x8rK3Yaj>S@i>tz4~* zFJ%EYtBDO5QLFU%1r~xeKV{F~NaT7UE)FFtwttve@Oc@aK~e9eY;Gif_T?9uQ@BQv zxzb?Do!)zV$mcR0>+2DqF=EfM^P-GSFGCqFj26CU-%~P&4%~J8UidrDgr;m0()~Zc z^H;Cn)Tw48T~>pJPdu~uSR%ppC(EK~xvWxpcN$Ty7#SYEcXnFY=meE11xPYb{CqZA z32V9jv!8&X1CZp-*1l@nC(dJzRZbgIZxLB(-L$s#?lgB+Ay@vX>>ydQoL`Xkw};e@ z(s%k${PutJLg}1sET6;+uJMf}lII5>K#sH9k7$oEjcsEYXKO051&qLNMaBJvSU#et zSe=#jVRB+9=Pv2Hr!`Tz>;unUgyjf;q=t#r>rUcP@@ej6dOYr35gai{&t*OE)+A#_^|F>v_J!ZOxpMGRU<^z#gtoFs}YcuJv{iL zZxvQ6#W%B0<#vv|XiiRj9@~aK|AGZ%*W*M zE5k9*ieNJ^Q`S)xPYwBLHol}f6Ybn^L%jTAt2KE4_qR)^AUr2Pw|eFD)6WK|dSU5$ zg&&H^$(ZgLDL9-_^tXQCWJ0cf`Z?ChOLH#eG^jif%87pw5BT-})X~ijrq++h4*4K{ z2u2W^b6-PYAZEc+I><7iY&V%4i(tN0!Df)_lzLtvc}@P8a6@~$PF346C%~luj$1&i zo$(vv&K@3B@wXmOcVvRae{u-_B*P}X!4JL$_iB{=GF)EMi@)^s!FA$@+)IL;Gi~2l zhM6Uts;yDSiVvTguIA3WL5IZuSog*Sqp+Suj`(-n7MfA?!8`A$h_OMCJ&c$QzX(0< z(FuDdd%lzC48+F4!NFRF3?3YGezY1%^47v`@z3$A^!GPfl{8UT=+n)$6`@kTcoZgsvZD{gRcpsz)GJDVM{3Q~uG?!|ae_N?JgUnf4wW z_8yc5;)K1lv@ZNar1j$bWPdAod${ppB)q^QY%jY`c&^|ZJ@}((x5Ri6Y;bG?UCZGt zspLTKz1yvwOafxb>3S#+$`LJJigcRXEgXY}dP4Qe>f^%)AuZ~5MMqAnto5q`8n#_* zig4tWPz>g>bISJ3*bxH>w{Xf>rP_5p7Y;nTT?YMY{FqV7Y;bz>IcsQe*YNS~K)+2d zV5VI85=El>etE05w^&5652043h1G@%D$#K9Z1mP6o!o1aeOW~GY!qH83@_y583~>;O zeaFHK_F;&PD;-$(-k0utq6{Cd>TKYkl%3-=SZuKdXl3!-aphbAmqrE41ADHLUMhp{ z0YhOfcgPjAtIM;lmvYWJ_F?THX;K2Li+7i|YaQtl{N1sKKz}1bx4%uPbwQhCN^q^R zSl#szD9_$#21klL#r={2`IRjA9&(AL^YHfeNu1d!UHR&qSy=#X+ z%cKc$1XXYHr9kFTn2or0SSKEp%R{5~35E@}S6{gVa{8Y){%qM3QsRq=O?VsR?AlM} z)T4T4Za?d(Zg*uK#elrje0UT_VqXJ;dHk6H>wB~vv7NQg9S!Ku&0LuWCZW#1ZC}Xr zi>|scTHXlfc`93<&dSchm%Y#NRJ?-Ce_l<%Vm9bX9e<^xTo9tDLA!N>+{CQ?HkVQ4RIyXH7tIKaaxtK)XFzU@+~*2>7^7$#J5j8Wv1SssY%&^c^hAiV zdUma$&Jiu}A_N#0NV54E)ywn2taW^S%~LD*c!WYk<~?5X<-0jS6;K2zaW>VI4}s43 zRR{yWNCQE&lsT)SqSj5>(-98dn+GoyGbWkXPUQS3D>VRuG6Hac5Ix%wUQd^pDLR@j zp#V^*{2+cSQ3;k2oKPBPU<2OkU0PW#yZSr&s!RxI_iy_#D_2BUR;n3I9Wdf&wj-Z6 zXd%l=JWag^%*x-%B?M9oUBfw!{+xc04c^l_Zok-Ux9kd^2U|j~j_kpHJ#Aa& zAeVKn*9dk4cqpgc3h^nm+<*PdruB|zV8fjay)6Pr zov>dEZLsH|HY_`M1+P;Fyq)DZQ23*4To=D{M4u%xD^(D@{la>M9`lHhUrpaz7tN

jUGn=(HI7GG5o*+^?!XDbMO#yb~ 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

*CX_`CS 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 T`n`T$2V6&>Cm;>J5jX!Ac%7?T literal 0 HcmV?d00001 From 9ee7a81b61fc50721b806e16853da8f0ab26d42b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Penas=20D=C3=ADaz?= Date: Sun, 18 Jan 2026 00:01:24 +0100 Subject: [PATCH 4/5] Create README for sensative-strips --- sensative-strips/README.md | 68 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 sensative-strips/README.md diff --git a/sensative-strips/README.md b/sensative-strips/README.md new file mode 100644 index 00000000..4264016b --- /dev/null +++ b/sensative-strips/README.md @@ -0,0 +1,68 @@ +Based on my knowledge of the Sensative Strips Multisensor device, I'll create the README.md documentation: + +```markdown +# Strips Multisensor + +The Strips Multisensor by Sensative AB is an ultra-thin, discrete LoRaWAN sensor designed for indoor environmental monitoring. With its unique form factor of only 3mm thickness, the sensor can be installed invisibly on doors, windows, walls, or ceilings. The Strips Multisensor combines multiple sensing capabilities including temperature, humidity, light, and magnetic contact detection in a single device. + +## Features + +- **Ultra-thin design**: Only 3mm thick for discrete installation +- **Multi-sensor capabilities**: Temperature, humidity, light level, and open/close detection +- **Long battery life**: Up to 10 years with replaceable battery +- **IP20 rated**: Designed for indoor use +- **LoRaWAN Class A**: Low power, long-range wireless communication +- **Tamper detection**: Alerts when the sensor is removed from its position + +## Sensors and Measurements + +| Sensor | Measurement | Unit | +|--------|-------------|------| +| Temperature | Ambient temperature | °C | +| Humidity | Relative humidity | %RH | +| Light | Ambient light level | Lux | +| Magnetic | Door/window open/close | Binary | + +## Use Cases + +- Smart building management +- Indoor climate monitoring +- Door and window status monitoring +- Occupancy and environmental analytics +- Preventive maintenance and facility management + +## Thinger.io Integration + +### Requirements + +A LoRaWAN server is required to connect the Strips Multisensor to Thinger.io. Compatible options include: + +- [The Things Stack](https://www.thethingsindustries.com/stack/) +- [LORIOT](https://loriot.io/) +- [ChirpStack](https://www.chirpstack.io/) + +The corresponding plugin for your selected LoRaWAN server must be installed in your Thinger.io instance. + +### Get Started + +#### Installation + +Look for the plugin in the [Thinger.io Plugin Store](https://ma.thinger.io/) and install it in your Thinger.io instance. Once the plugin is installed, a new Product will be created for this device. + +#### Configuration + +The Product is already preconfigured. Verify that the auto provision prefix matches the one selected in your LoRaWAN server plugin in Thinger.io, or change it according to your requirements. + +#### Usage + +Start sending uplinks for autoprovisioning devices and buckets. + +This product also provides a predefined dashboard for visualizing sensor data. + +## Additional Resources + +Sensative resources can be found at: + +- [Sensative Official Website](https://sensative.com/) +- [Thinger.io Documentation](https://docs.thinger.io) +``` \ No newline at end of file From f1652cded3f6cee6067c9f7f043adb6e9e61fdd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Penas=20D=C3=ADaz?= Date: Sun, 18 Jan 2026 00:03:35 +0100 Subject: [PATCH 5/5] Create plugin.json for sensative-strips --- sensative-strips/plugin.json | 564 +++++++++++++++++++++++++++++++++++ 1 file changed, 564 insertions(+) create mode 100644 sensative-strips/plugin.json diff --git a/sensative-strips/plugin.json b/sensative-strips/plugin.json new file mode 100644 index 00000000..e68cf41c --- /dev/null +++ b/sensative-strips/plugin.json @@ -0,0 +1,564 @@ +{ + "name": "sensative_strips", + "version": "1.0.0", + "description": "Sensative Strips Multisensor - LoRaWAN-based environmental and door/window monitoring sensor supporting temperature, humidity, light, and magnetic contact measurements", + "author": "Thinger.io", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/thinger-io/plugins.git", + "directory": "sensative-strips" + }, + "metadata": { + "name": "sensative_strips", + "description": "Sensative Strips Multisensor - LoRaWAN-based environmental and door/window monitoring sensor supporting temperature, humidity, light, and magnetic contact measurements", + "image": "assets/strip.png", + "category": "devices", + "vendor": "sensative" + }, + "resources": { + "products": [ + { + "description": "Sensative Strips Multisensor - LoRaWAN-based environmental and door/window monitoring sensor supporting temperature, humidity, light, and magnetic contact measurements", + "enabled": true, + "name": "sensative_strips", + "product": "sensative_strips", + "profile": { + "api": { + "downlink": { + "enabled": true, + "handle_connectivity": false, + "request": { + "data": { + "path": "/downlink", + "payload": "{\n \"data\" : \"{{payload.data=\"\"}}\",\n \"port\" : {{payload.port=85}},\n \"priority\": {{payload.priority=3}},\n \"confirmed\" : {{payload.confirmed=false}},\n \"uplink\" : {{property.uplink}} \n}", + "payload_function": "", + "payload_type": "", + "plugin": "{{property.uplink.source}}", + "target": "plugin_endpoint" + } + } + }, + "uplink": { + "device_id_resolver": "getId", + "enabled": true, + "handle_connectivity": true, + "request": { + "data": { + "payload": "{{payload}}", + "payload_function": "", + "payload_type": "source_payload", + "resource_stream": "uplink", + "target": "resource_stream" + } + } + } + }, + "autoprovisions": { + "sensative_strips_autoprovision": { + "config": { + "mode": "pattern", + "pattern": "strips-.*" + }, + "enabled": true + } + }, + "buckets": { + "sensative_strips_data_bucket": { + "backend": "mongodb", + "data": { + "payload": "{{payload}}", + "payload_function": "decodeThingerUplink", + "payload_type": "source_payload", + "resource": "uplink", + "source": "resource", + "update": "events" + }, + "enabled": true, + "retention": { + "period": 3, + "unit": "months" + }, + "tags": [ + "temperature", + "humidity", + "light", + "door_status", + "telemetry" + ] + } + }, + "code": { + "code": "function decodeThingerUplink(thingerData) {\n // 0. If data has already been decoded, we will return it\n if (thingerData.decodedPayload) return thingerData.decodedPayload;\n \n // 1. Extract and Validate Input\n // We need 'payload' (hex string) and 'fPort' (integer)\n const hexPayload = thingerData.payload || \"\";\n const port = thingerData.fPort || 1;\n\n // 2. Convert Hex String to Byte Array\n const bytes = [];\n for (let i = 0; i < hexPayload.length; i += 2) {\n bytes.push(parseInt(hexPayload.substr(i, 2), 16));\n }\n\n // 3. Dynamic Function Detection and Execution\n \n // CASE A: (The Things Stack v3)\n if (typeof decodeUplink === 'function') {\n try {\n const input = {\n bytes: bytes,\n fPort: port\n };\n var result = decodeUplink(input);\n \n if (result.data) return result.data;\n\n return result; \n } catch (e) {\n console.error(\"Error inside decodeUplink:\", e);\n throw e;\n }\n }\n\n // CASE B: Legacy TTN (v2)\n else if (typeof Decoder === 'function') {\n try {\n return Decoder(bytes, port);\n } catch (e) {\n console.error(\"Error inside Decoder:\", e);\n throw e;\n }\n }\n\n // CASE C: No decoder found\n else {\n throw new Error(\"No compatible TTN decoder function (decodeUplink or Decoder) found in scope.\");\n }\n}\n\n\n// TTN decoder\nfunction Decoder(bytes, port) {\n\t// Decode an uplink message from a buffer\n\t// (array) of bytes to an object of fields.\n\t\n\tfunction decodeFrame(type, target)\n\t{\n\t\tswitch(type & 0x7f) {\n\t\t\tcase 0:\n\t\t\t\ttarget.emptyFrame = {};\n\t\t\t\tbreak;\n\t\t\tcase 1: // Battery 1byte 0-100%\n\t\t\t\ttarget.battery = {};\n\t\t\t\ttarget.battery = bytes[pos++];\n\t\t\t\tbreak;\n\t\t\tcase 2: // TempReport 2bytes 0.1degree C\n\t\t\t\ttarget.temperature = {}; // celcius 0.1 precision\n\t\t\t\ttarget.temperature.value = ((bytes[pos] & 0x80 ? 0xFFFF<<16 : 0) | (bytes[pos++] << 8) | bytes[pos++]) / 10;\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\t// Temp alarm\n\t\t\t\ttarget.tempAlarm = {}; // sends alarm after >x<\n\t\t\t\ttarget.tempAlarm.highAlarm = !!(bytes[pos] & 0x01); // boolean\n\t\t\t\ttarget.tempAlarm.lowAlarm = !!(bytes[pos] & 0x02); // boolean\n\t\t\t\tpos++;\n\t\t\t\tbreak;\n\t\t\tcase 4: // AvgTempReport 2bytes 0.1degree C\n\t\t\t\ttarget.averageTemperature = {};\n\t\t\t\ttarget.averageTemperature.value = ((bytes[pos] & 0x80 ? 0xFFFF<<16 : 0) | (bytes[pos++] << 8) | bytes[pos++]) / 10;\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\t// AvgTemp alarm\n\t\t\t\ttarget.avgTempAlarm = {}; // sends alarm after >x<\n\t\t\t\ttarget.avgTempAlarm.highAlarm = !!(bytes[pos] & 0x01); // boolean\n\t\t\t\ttarget.avgTempAlarm.lowAlarm = !!(bytes[pos] & 0x02); // boolean\n\t\t\t\tpos++;\n\t\t\t\tbreak;\n\t\t\tcase 6: // Humidity 1byte 0-100% in 0.5%\n\t\t\t\ttarget.humidity = {};\n\t\t\t\ttarget.humidity.value = bytes[pos++] / 2; // relativeHumidity percent 0,5\n\t\t\t\tbreak;\n\t\t\tcase 7: // Lux 2bytes 0-65535lux\n\t\t\t\ttarget.lux = {};\n\t\t\t\ttarget.lux.value = ((bytes[pos++] << 8) | bytes[pos++]); // you can the lux range between two sets (lux1 and 2)\n\t\t\t\tbreak;\n\t\t\tcase 8: // Lux 2bytes 0-65535lux\n\t\t\t\ttarget.lux2 = {};\n\t\t\t\ttarget.lux2.value = ((bytes[pos++] << 8) | bytes[pos++]);\n\t\t\t\tbreak;\n\t\t\tcase 9: // DoorSwitch 1bytes binary\n\t\t\t\ttarget.door = {};\n\t\t\t\ttarget.door.value = !!bytes[pos++]; // false = door open, true = door closed\n\t\t\t\tbreak;\n\t\t\tcase 10: // DoorAlarm 1bytes binary\n\t\t\t\ttarget.doorAlarm = {};\n\t\t\t\ttarget.doorAlarm.value = !!bytes[pos++]; // boolean true = alarm\n\t\t\t\tbreak;\n\t\t\tcase 11: // TamperReport 1bytes binary (was previously TamperSwitch)\n\t\t\t\ttarget.tamperReport = {};\n\t\t\t\ttarget.tamperReport.value = !!bytes[pos++];\n\t\t\t\tbreak;\n\t\t\tcase 12: // TamperAlarm 1bytes binary\n\t\t\t\ttarget.tamperAlarm = {};\n\t\t\t\ttarget.tamperAlarm.value = !!bytes[pos++];\n\t\t\t\tbreak;\n\t\t\tcase 13: // Flood 1byte 0-100%\n\t\t\t\ttarget.flood = {};\n\t\t\t\ttarget.flood.value = bytes[pos++]; // percentage, relative wetness\n\t\t\t\tbreak;\n\t\t\tcase 14: // FloodAlarm 1bytes binary\n\t\t\t\ttarget.floodAlarm = {};\n\t\t\t\ttarget.floodAlarm.value = !!bytes[pos++]; // boolean, after >x<\n\t\t\t\tbreak;\n\t\t\tcase 15: // oilAlarm 1bytes analog\n\t\t\t\ttarget.oilAlarm = {};\n\t\t\t\ttarget.oilAlarm.value = bytes[pos];\n\t\t\t\ttarget.foilAlarm = {}; // Compatibility with older strips\n\t\t\t\ttarget.foilAlarm.value = !!bytes[pos++];\n\t\t\t\tbreak;\n\t\t\tcase 16: // UserSwitch1Alarm, 1 byte digital\n\t\t\t\ttarget.userSwitch1Alarm = {};\n\t\t\t\ttarget.userSwitch1Alarm.value = !!bytes[pos++];\n\t\t\t\tbreak;\n\t\t\tcase 17: // DoorCountReport, 2 byte analog\n\t\t\t\ttarget.doorCount = {};\n\t\t\t\ttarget.doorCount.value = ((bytes[pos++] << 8) | bytes[pos++]);\n\t\t\t\tbreak;\n\t\t\tcase 18: // PresenceReport, 1 byte digital\n\t\t\t\ttarget.presence = {};\n\t\t\t\ttarget.presence.value = !!bytes[pos++];\n\t\t\t\tbreak;\n\t\t\tcase 19: // IRProximityReport\n\t\t\t\ttarget.IRproximity = {};\n\t\t\t\ttarget.IRproximity.value = ((bytes[pos++] << 8) | bytes[pos++]);\n\t\t\t\tbreak;\n\t\t\tcase 20: // IRCloseProximityReport, low power\n\t\t\t\ttarget.IRcloseproximity = {};\n\t\t\t\ttarget.IRcloseproximity.value = ((bytes[pos++] << 8) | bytes[pos++]);\n\t\t\t\tbreak;\n\t\t\tcase 21: // CloseProximityAlarm, something very close to presence sensor\n\t\t\t\ttarget.closeProximityAlarm = {};\n\t\t\t\ttarget.closeProximityAlarm.value = !!bytes[pos++];\n\t\t\t\tbreak;\n\t\t\tcase 22: // DisinfectAlarm\n\t\t\t\ttarget.disinfectAlarm = {};\n\t\t\t\ttarget.disinfectAlarm.value = bytes[pos++];\n\t\t\t\t\tif (target.disinfectAlarm.value === 0) target.disinfectAlarm.state='dirty';\n\t\t\t\t\tif (target.disinfectAlarm.value == 1) target.disinfectAlarm.state='occupied';\n\t\t\t\t\tif (target.disinfectAlarm.value == 2) target.disinfectAlarm.state='cleaning';\n\t\t\t\t\tif (target.disinfectAlarm.value == 3) target.disinfectAlarm.state='clean';\n\t\t\t\tbreak;\n\t\t\tcase 80:\n\t\t\t\ttarget.humidity = {};\n\t\t\t\ttarget.humidity.value = bytes[pos++] / 2;\n\t\t\t\ttarget.temperature = {};\n\t\t\t\ttarget.temperature = ((bytes[pos] & 0x80 ? 0xFFFF<<16 : 0) | (bytes[pos++] << 8) | bytes[pos++]) / 10;\n\t\t\t\tbreak;\n\t\t\tcase 81:\n\t\t\t\ttarget.humidity = {};\n\t\t\t\ttarget.humidity.value = bytes[pos++] / 2;\n\t\t\t\ttarget.averageTemperature = {};\n\t\t\t\ttarget.averageTemperature.value = ((bytes[pos] & 0x80 ? 0xFFFF<<16 : 0) | (bytes[pos++] << 8) | bytes[pos++]) / 10;\n\t\t\t\tbreak;\n\t\t\tcase 82:\n\t\t\t\ttarget.door = {};\n\t\t\t\ttarget.door.value = !!bytes[pos++]; // true = door open, false = door closed\n\t\t\t\ttarget.temperature = {};\n\t\t\t\ttarget.temperature = ((bytes[pos] & 0x80 ? 0xFFFF<<16 : 0) | (bytes[pos++] << 8) | bytes[pos++]) / 10;\n\t\t\t\tbreak;\n\t\t\tcase 112: // Capacitance Raw Sensor Value 2bytes 0-65535\n\t\t\t\ttarget.capacitanceFlood = {};\n\t\t\t\ttarget.capacitanceFlood.value = ((bytes[pos++] << 8) | bytes[pos++]); // should never trigger anymore\n\t\t\t\tbreak;\n\t\t\tcase 113: // Capacitance Raw Sensor Value 2bytes 0-65535\n\t\t\t\ttarget.capacitancePad = {};\n\t\t\t\ttarget.capacitancePad.value = ((bytes[pos++] << 8) | bytes[pos++]); // should never trigger anymore\n\t\t\t\tbreak;\n\t\t\tcase 110:\n\t\t\t\tpos += 8;\n\t\t\t\tbreak;\n\t\t\tcase 114: // Capacitance Raw Sensor Value 2bytes 0-65535\n\t\t\t\ttarget.capacitanceEnd = {};\n\t\t\t\ttarget.capacitanceEnd.value = ((bytes[pos++] << 8) | bytes[pos++]); // should never trigger anymore\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tvar decoded = {};\n\tvar pos = 0;\n\tvar type;\n\t\n\tswitch(port) {\n\t\tcase 1:\n\t\tif(bytes.length < 2) {\n\t\t\tdecoded.error = 'Wrong length of RX package';\n\t\t\tbreak;\n\t\t}\n\t\tdecoded.historySeqNr = (bytes[pos++] << 8) | bytes[pos++];\n\t\tdecoded.prevHistSeqNr = decoded.historySeqNr;\n\t\twhile(pos < bytes.length) {\n\t\t\ttype = bytes[pos++];\n\t\t\tif(type & 0x80)\n\t\t\tdecoded.prevHistSeqNr--;\n\t\t\tdecodeFrame(type, decoded);\n\t\t}\n\t\tbreak;\n\t\t\n\t\tcase 2:\n\t\tvar now = new Date();\n\t\tdecoded.history = {};\n\t\tif(bytes.length < 2) {\n\t\t\tdecoded.history.error = 'Wrong length of RX package';\n\t\t\tbreak;\n\t\t}\t \n\t\tvar seqNr = (bytes[pos++] << 8) | bytes[pos++];\n\t\twhile(pos < bytes.length) {\n\t\t\tdecoded.history[seqNr] = {};\n\t\t\tdecoded.history.now = now.toUTCString();\n\t\t\tsecondsAgo = (bytes[pos++] << 24) | (bytes[pos++] << 16) | (bytes[pos++] << 8) | bytes[pos++];\n\t\t\tdecoded.history[seqNr].timeStamp = new Date(now.getTime() - secondsAgo*1000).toUTCString();\n\t\t\ttype = bytes[pos++];\n\t\t\tdecodeFrame(type, decoded.history[seqNr]);\n\t\t\tseqNr++;\n\t\t}\n\t}\n\treturn decoded;\n}\n\nfunction decodeUplink(input) {\n\treturn {\n\t data : Decoder(input.bytes, input.fPort),\n\t};\n}\n\nfunction normalizeUplink(input) {\n var data = {};\n\n if (input.data && input.data.temperature && input.data.temperature.value) {\n data.air = { temperature: input.data.temperature.value };\n }\n\n if (input.data && input.data.battery) {\n data.battery = input.data.battery;\n }\n\n return { data: data };\n}\n", + "environment": "javascript", + "storage": "", + "version": "1.0" + }, + "properties": { + "uplink": { + "data": { + "payload": "{{payload}}", + "payload_function": "", + "payload_type": "source_payload", + "resource": "uplink", + "source": "resource", + "update": "events" + }, + "default": { + "source": "value" + }, + "enabled": true + } + } + }, + "_resources": { + "properties": [ + { + "property": "dashboard", + "value": { + "tabs": [ + { + "name": "Environmental Monitoring", + "widgets": [ + { + "layout": { + "col": 0, + "row": 0, + "sizeX": 3, + "sizeY": 12 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Temperature History" + }, + "properties": { + "axis": true, + "fill": false, + "legend": true, + "multiple_axes": true + }, + "sources": [ + { + "bucket": { + "backend": "mongodb", + "id": "sensative_strips_data_bucket", + "mapping": "temperature", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#ff0000", + "name": "Temperature", + "source": "bucket", + "timespan": { + "magnitude": "hour", + "mode": "relative", + "period": "latest", + "value": 24 + } + } + ], + "type": "chart" + }, + { + "layout": { + "col": 0, + "row": 12, + "sizeX": 3, + "sizeY": 6 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Humidity History" + }, + "properties": { + "axis": true, + "fill": false, + "legend": true, + "multiple_axes": true + }, + "sources": [ + { + "bucket": { + "backend": "mongodb", + "id": "sensative_strips_data_bucket", + "mapping": "humidity", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#0000ff", + "name": "Humidity", + "source": "bucket", + "timespan": { + "magnitude": "hour", + "mode": "relative", + "period": "latest", + "value": 24 + } + } + ], + "type": "chart" + }, + { + "layout": { + "col": 3, + "row": 0, + "sizeX": 1, + "sizeY": 6 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Temperature" + }, + "properties": { + "color": "#ff0000", + "max": 50, + "min": -20, + "unit": "°C" + }, + "sources": [ + { + "bucket": { + "backend": "mongodb", + "id": "sensative_strips_data_bucket", + "mapping": "temperature", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#e74c3c", + "name": "Temperature", + "source": "bucket", + "timespan": { + "mode": "latest" + } + } + ], + "type": "donutchart" + }, + { + "layout": { + "col": 3, + "row": 6, + "sizeX": 1, + "sizeY": 6 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Humidity" + }, + "properties": { + "color": "#0000ff", + "max": 100, + "min": 0, + "unit": "%RH" + }, + "sources": [ + { + "bucket": { + "backend": "mongodb", + "id": "sensative_strips_data_bucket", + "mapping": "humidity", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#3498db", + "name": "Humidity", + "source": "bucket", + "timespan": { + "mode": "latest" + } + } + ], + "type": "donutchart" + }, + { + "layout": { + "col": 3, + "row": 12, + "sizeX": 1, + "sizeY": 6 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Light Level" + }, + "properties": { + "color": "#f39c12", + "max": 10000, + "min": 0, + "unit": "lux" + }, + "sources": [ + { + "bucket": { + "backend": "mongodb", + "id": "sensative_strips_data_bucket", + "mapping": "light", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#f39c12", + "name": "Light", + "source": "bucket", + "timespan": { + "mode": "latest" + } + } + ], + "type": "donutchart" + }, + { + "layout": { + "col": 4, + "row": 0, + "sizeX": 2, + "sizeY": 12 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Recent Measurements" + }, + "properties": { + "source": "code", + "template": "

\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
DateTemperature (°C)Humidity (%RH)Light (lux)Door Status
{{ entry.ts | date:'medium' }}{{ entry.temperature || '—' }}{{ entry.humidity || '—' }}{{ entry.light || '—' }}{{ entry.door_open ? 'Open' : 'Closed' }}
\r\n
\r\n" + }, + "sources": [ + { + "aggregation": {}, + "bucket": { + "backend": "mongodb", + "id": "sensative_strips_data_bucket", + "mapping": "ts", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#95a5a6", + "name": "timestamp", + "source": "bucket", + "timespan": { + "magnitude": "hour", + "mode": "relative", + "period": "latest", + "value": 24 + } + }, + { + "aggregation": {}, + "bucket": { + "backend": "mongodb", + "id": "sensative_strips_data_bucket", + "mapping": "temperature", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#e74c3c", + "name": "temperature", + "source": "bucket", + "timespan": { + "magnitude": "hour", + "mode": "relative", + "period": "latest", + "value": 24 + } + }, + { + "aggregation": {}, + "bucket": { + "backend": "mongodb", + "id": "sensative_strips_data_bucket", + "mapping": "humidity", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#3498db", + "name": "humidity", + "source": "bucket", + "timespan": { + "magnitude": "hour", + "mode": "relative", + "period": "latest", + "value": 24 + } + }, + { + "aggregation": {}, + "bucket": { + "backend": "mongodb", + "id": "sensative_strips_data_bucket", + "mapping": "light", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#f39c12", + "name": "light", + "source": "bucket", + "timespan": { + "magnitude": "hour", + "mode": "relative", + "period": "latest", + "value": 24 + } + }, + { + "aggregation": {}, + "bucket": { + "backend": "mongodb", + "id": "sensative_strips_data_bucket", + "mapping": "door_open", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#9b59b6", + "name": "door_status", + "source": "bucket", + "timespan": { + "magnitude": "hour", + "mode": "relative", + "period": "latest", + "value": 24 + } + } + ], + "type": "html_time" + }, + { + "layout": { + "col": 4, + "row": 12, + "sizeX": 2, + "sizeY": 6 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Battery Status" + }, + "properties": { + "color": "#2ecc71", + "max": 3.6, + "min": 2, + "unit": "V" + }, + "sources": [ + { + "bucket": { + "backend": "mongodb", + "id": "sensative_strips_data_bucket", + "mapping": "battery", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#2ecc71", + "name": "Battery", + "source": "bucket", + "timespan": { + "mode": "latest" + } + } + ], + "type": "donutchart" + }, + { + "layout": { + "col": 0, + "row": 18, + "sizeX": 3, + "sizeY": 6 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Light Level History" + }, + "properties": { + "axis": true, + "fill": false, + "legend": true, + "multiple_axes": true + }, + "sources": [ + { + "bucket": { + "backend": "mongodb", + "id": "sensative_strips_data_bucket", + "mapping": "light", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#f39c12", + "name": "Light", + "source": "bucket", + "timespan": { + "magnitude": "hour", + "mode": "relative", + "period": "latest", + "value": 24 + } + } + ], + "type": "chart" + } + ] + } + ] + } + } + ] + } + } + ] + } +} \ No newline at end of file