From 590a0e7adbe1f64dc8d804ae126f3d8383bb907f Mon Sep 17 00:00:00 2001 From: michele Date: Thu, 26 Dec 2024 19:17:25 +0100 Subject: [PATCH] Modified from original ui-digital-clock --- CHANGELOG.md | 9 ++++ LICENSE | 21 ++++++++ README.md | 43 ++++++++++++++++ clock.html | 69 ++++++++++++++++++++++++++ clock.js | 123 ++++++++++++++++++++++++++++++++++++++++++++++ clock.png | Bin 0 -> 3246 bytes clock.svg.bak | 48 ++++++++++++++++++ digital-clock.png | Bin 0 -> 6917 bytes example.png | Bin 0 -> 5198 bytes package.json | 37 ++++++++++++++ pi.png | Bin 0 -> 2433 bytes 11 files changed, 350 insertions(+) create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 clock.html create mode 100644 clock.js create mode 100644 clock.png create mode 100644 clock.svg.bak create mode 100644 digital-clock.png create mode 100644 example.png create mode 100644 package.json create mode 100644 pi.png diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..f544641 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,9 @@ +# Changelog + +## [v1.0.0] - 2022-04-29 + +### Added +- Functional digital clock for the Node-RED Dashboard +- Readme, Changelog and License + +[v1.0.0]: https://github.com/patrickknabe/node-red-contrib-ui-digital-clock/releases/tag/v1.0.0 \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ad0e527 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 patrickknabe + +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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8dee3c1 --- /dev/null +++ b/README.md @@ -0,0 +1,43 @@ +# node-red-contrib-ui-digital-clock + +A digital clock for the Node-RED Dashboard. + +![](digital-clock.png) + +## Installation + +Open Node-RED and select `Manage palette` from the menu to open the Palette Manager. Go to the `Install` tab, search for `node-red-contrib-ui-digital-clock` and click `install`. + +Alternatively, you can run the following command in your Node-RED user directory (typically `~/.node-red`): + +``` +npm i node-red-contrib-ui-digital-clock +``` + +## Example + +![](example.png) + +``` +[{"id":"c09db1ba6ac377de","type":"tab","label":"Flow 1","disabled":false,"info":"","env":[]},{"id":"37ec70937bed02a4","type":"ui_digital_clock","z":"c09db1ba6ac377de","name":"","group":"5c79b643fcd37cad","order":0,"width":"6","height":"2","x":710,"y":340,"wires":[]},{"id":"105daf8d29a83f81","type":"inject","z":"c09db1ba6ac377de","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"1","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":490,"y":340,"wires":[["37ec70937bed02a4"]]},{"id":"5c79b643fcd37cad","type":"ui_group","name":"Standard","tab":"f4a9e911ba044f38","order":1,"disp":true,"width":"6","collapse":false,"className":""},{"id":"f4a9e911ba044f38","type":"ui_tab","name":"Home","icon":"dashboard","disabled":false,"hidden":false}] +``` + +## License + +[MIT](LICENSE) + +## Projects + +Also take a look at my other dashboard projects: + +### [node-red-contrib-ui-clock](https://github.com/patrickknabe/node-red-contrib-ui-clock) + +A simple analog clock for the Node-RED Dashboard. + +![](clock.png) + +### [node-red-contrib-ui-digital-display](https://github.com/patrickknabe/node-red-contrib-ui-digital-display) + +A digital display, with adjustable number of digits and decimals, for the Node-RED Dashboard. + +![](pi.png) \ No newline at end of file diff --git a/clock.html b/clock.html new file mode 100644 index 0000000..525be4e --- /dev/null +++ b/clock.html @@ -0,0 +1,69 @@ + + + + + \ No newline at end of file diff --git a/clock.js b/clock.js new file mode 100644 index 0000000..144e7e8 --- /dev/null +++ b/clock.js @@ -0,0 +1,123 @@ +module.exports = RED => { + let ui; + + RED.nodes.registerType( 'ui_microwave_clock', function( config ) { + RED.nodes.createNode( this, config ); + + if( !ui ) { + try { + ui = RED.require( 'node-red-dashboard' )( RED ); + } catch {} + } + + if( ui && RED.nodes.getNode( config.group ) ) { + this.on( 'close', ui.addWidget( { + node: this, + format: ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `, + width: +config.width || +RED.nodes.getNode( config.group ).config.width, + height: +config.height || 1, + group: config.group, + order: config.order, + beforeEmit: msg => ( { msg } ), + initController: $scope => $scope.$watch( 'msg.payload', payload => { + const total_seconds = +payload || 0; + let remaining_seconds = total_seconds; + + let hours = Math.floor(remaining_seconds / 3600.0); + remaining_seconds -= hours * 3600.0; + let minutes = Math.floor(remaining_seconds / 60.0); + remaining_seconds -= minutes * 60.0; + let seconds = remaining_seconds; + + let s = hours.toString().padStart( 4, ' ' ); + s += minutes.toString().padStart( 2, '0' ); + s += seconds.toString().padStart( 2, '0' ); + s += !( seconds % 2 ) ? ':' : ' '; + s += !( seconds % 2 ) ? ':' : ' '; + + $scope.segs = []; + + for( const c of s ) { + $scope.segs.push( { + '0': [ true, true, true, false, true, true, true ], + '1': [ false, false, true, false, false, true, false ], + '2': [ true, false, true, true, true, false, true ], + '3': [ true, false, true, true, false, true, true ], + '4': [ false, true, true, true, false, true, false ], + '5': [ true, true, false, true, false, true, true ], + '6': [ true, true, false, true, true, true, true ], + '7': [ true, false, true, false, false, true, false ], + '8': [ true, true, true, true, true, true, true ], + '9': [ true, true, true, true, false, true, true ], + ' ': [ false, false, false, false, false, false, false ], + ':': [ true ] + }[ c ] ); + } + } ) + } ) ); + } + } ); +}; \ No newline at end of file diff --git a/clock.png b/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..0c372313b6f291108ae9676d92be2f7ffe57c61d GIT binary patch literal 3246 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 literal 0 HcmV?d00001 diff --git a/clock.svg.bak b/clock.svg.bak new file mode 100644 index 0000000..a0ea190 --- /dev/null +++ b/clock.svg.bak @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/digital-clock.png b/digital-clock.png new file mode 100644 index 0000000000000000000000000000000000000000..bc3b4f51e7baaa232b1da2945877e6b8c2a5e222 GIT binary patch literal 6917 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 LNkvXXu0mjfQk<1G literal 0 HcmV?d00001 diff --git a/example.png b/example.png new file mode 100644 index 0000000000000000000000000000000000000000..a53c2c7065f75e87fdd78546c2cd5d842074072b GIT binary patch literal 5198 zcmeHLS6CBRx6O<*4k}F)0ck1_1O%icQWCJxLJ^TpkRt5|5+Vc$9n={Rqzs1M6*C|h zP^lq6L^?3WChjq?*IP2`aAI{llt@sD`4SCL9J_`T< zcwk0)4*`ImrBBvGuAfiFNgaW#lSw2{-!9M+YrdF8d&UFSv4boEtDUQK~;NSBVU4joTjqZ%jO@hMvaKIEFN8jwsURcpUGYxL5&NOp3=)@Mb}9_BizAlzB`o7{Y=TwGFL zTM1tMMG(H$&xxNKo!9yDG#O}(I7Z&ULDW1<2KGwW$;8A2fq1`mu4ee5iDJ!gSn00- zz)uF_005UL0N{G+A6!8I0KfD6gP0FL0e;|@r#(J3p9BGbr#zzUB!d&?Llb0?uZY1Z zz%ODawEscj2Lk{<@a6PBxc#5={}bcK=Kn^xa^1?NJRN_M0%F|g)hrWPfH(Um0BijJ zS^#Weh8aH>hE4tGfLF@w?Oa5HbIJeOLfH=|uSFW;!P%x&o_%l3hJfDK-}^3->2xPc zOEfzo{_Rk`x&f@T!?)j6N}V~X@-;kRtnBxUEt@Oxj4X>l{FS~WD3x&HZr*VIC{dWE!>0oZ5ad*VFWOK8SHetz>C#OVpyQCk57|~Sk`C+Y7RSsyfTbZ=d z1%7YrYkE~G$x=9}qXkA8AHQA)D4}S&ryCTjWSg$9uSYru5*&-Qq+Avo6DdL!o37`4 z#<@o9Vqvo4p&o`91HiKiIPOd;SY*jnO139Ps)ILfW*^;-WbOWOHLQN^L3cR52Try~ z9Z>2W^Esr(s$G~7DCrz#Aeoz|V?JbaoDYYWqMQ$@FbaNDHaS9=fXCSsgy_3IWtcdB zcb{aO5p^*(idRL#66CnY^xs*ZPG1NhOcEvX2vgtpJCwk@u4)h5+={6s>oVT%oblmW zj&DGB%zAaptc2-f$E`mry>RV}Qg8R(Q&{^pQFGt{(0FY3=KDK%uyE@b4p#|V(6F)( zFU5YiBgvKuiX}VldOeY(imD)9O+UWm&gU;5Sw|yW37^XkQz*IfTUu2)#oISsI+HT$ z_t6N4!#Uu=GBO^Vtwqa#$W?liFF046*U-|^(ztFvB*qe75uZ=KC}QTur8jgiMokOq zD7d=2!)D7*ovONr6>!aR8|--`_FQLrdnGZg3{K)>S#a}8>@XBG^NY2*l+7Vj*e}iX zHr7HSej)Pc8?s+&G9;r|#HoTp1=7^|!n}Xb{`gU=mo{*oQN3S)BffqdR&SI{#>wPt zg+-##Rqc;8{ipTp?I(tPTQ`im%Yl_ejXCGfpC4#5z}p5@q5}_nL%ZMP^n6yd4GP4w zO9Q_2W@7@QzYmqjDe#6DK76s9ljI8$Y`($RmFsjG$@HUOy9?efF0mm2F*hbCj^f7xgg_ImMLL$9zZ(j^a zJ|~mps2<8&96@BO|9;xUwEvk(13Bjj;$$%GL*9y}mKy6Y@4G2{=H;zbR`~}IH2WwP zk_3*p=h>E8#(TbuE4OoHV|&R<$Wt*t(|>1(htvSlFPUBS5Ud0phaERG5;yuC5Qi?I z4UJ<*U#o-2NzVwLPEJ9b@dwZh0 zH)RF#YDa%>YikL2%075}_wKU^#EuF={c;i`nprf`Q!Z6G{A4*dFYC|IA@u@Rx5J0T z!x+_zYYD!6twPKKGg$Ls-#j#5m~}?Rr51tZ73W7uVmuX;6ELio2|+|%e+&_ zM*O91Nv9FWijOf|C-7oNawBzb3UcnU(UCZBy1Z`Fo3GS3`2nIYy#|#vvwwPA73$~> z-Kq4EkVzU!C6~Sl?}vPn+#~oeDhr$oye2bQ4GR>zir^oVNIXDw)%gvp_vhyy=s7e( zS`Pck1vLWLs!)=KqkH6iUg6!{NgY&rA;*(E+9auW{hR-jxW>-oqU#33`4OxIzI07? zQv^;nJ7FmN?()pb0K|)p*6>-Xe87BXvCx4(j))ZeX6GV(TW%F`_erkJWcYC9uUj+pcvQ~GDS zfXot2ok^L{D0+z9o_M3p_M=RTtXgT)_{sj{NP2Q-^${j_aZ{sda3QlJUaIf)Ww4^6 zBE3Y|{~7F&Z`FjvKBH*12OsSOu5`IG${2Vg(m62)wJoB8o&?*xuD|ZIv+@o*UvY^s z9Q0yhdfH2f*{siL9dxK$>?lxP+HhJZbeEjvK96crHgH$$;n(HVw{e*(d*yrOWaZ7< z6l&Qy><+C&xp|n$%s*1DJTA%ZtHDL8UX}BW|2}Qtd!PQ@ncKM}%UE)8YisL@;-c|K zpQGA>CiISHXO1~1ItXcznbtt3GZ(Fmlo8nbV!}~QA1iL9>>7|8BVZT#w2}HB9oUub zd}U!5_2a@a70xWEfiX3?O}iS%j}tluN- zK9U;h@v}v?iT)CYe&5}=Vxg`R`5>KXOp5%jYne0K3z6g{o=MeS(c=LWywKk%l4;9OH@{K! zfwq)|niZRn?Kh zJL!abGG=%ymX^I(_LUs;vlwGst#&N*7L6Hj(h&O!bs3rVH8nMRhbuKjBN^%Gq20Mk zC6ssKb>-sJN7=6~U!B_u4s7G-tjZc~npm3!6wX=1-Q#8u2o*Z1%LkMvzj<>^j4pW8 zwD$MW{?HmEI+EX%30`Z5r>F5Nd>SM2Hi6o{6`rrQ3GVFUyI^rX75@A7pZv0`R)u1Z zRcXs)SN1YgW`8?&kj4{`-#4>58aS2T5>36WNAC?4G;FRPN844MJR<1|-c(yw#KBs7 zgKvqRE4yejr56t^u1ROGG*x>T#DihJ0u!i1FG(|feOc&qKjiV^hINMd@kZU!TtO9C ztZ$5@TRqTtzz}NN8?jdHP#+%C4Ow$pgKxa#;o*^!lhf(1ay%)iQaLg&Fxu2X+wiClQQoMG1sYZU2?)>c7S;I4D6q>p8@R9VupYFu=M!`<{8~7QnBNNHS5OZ zrI=__`YO0HkHe0}9I%4R?=4@O;fo0NJ73er0GE8_1rhI~}Ns$x+xvc;lwX)}L4 zcggf)E?3u&=7uxL6c7;L(6`Lllr9)r2ZVN1{**m)KmoIMYS=2xdsBJ7ZJ*KA=P;UI zeQQK@En>@R33?yZ-5wy)ns8HgH+H>eBb)qo9hkQ=h#IR6wIp2g(6qdmH-W8|`&<4y z$NF9+IvMGx5C&Y!<3Jv!?~BFNOj_{%mF?@$-yvTD>I6#WPOKGO^ zk#gHgs}a$^WcG9tZ5Y(cA`-y|Q@!-oxu<^+!jdY_Tp0rpCq_ zGr=J2Le<(rFlc0CB$N1P&fEXO-@%|UkZ1}_hd0d(LYFuvjtzmR0V!w?uR4~VWp8)J z&MPI_(D*{;wA-j&m|qsq8k9RmmzYlI*9WCfQ3L|e=#nL!jDo&FQy{iftgq{VZEklO zXxfS`C3uL6|JE%*fNvh+M5)4xgVaOO=lg`gsj3)_Bb3eP z%y&gsmXP9u2ptIGC41kqdGk3GscF10?^1j*|wa)-?{T-;-PF69_vsf&wT>nT@V zDdrIo5rJ0ja1*?8z9<1MWe%Bsq(Osb5%H%A;4^1L30|#=g(~{(4N*k1rbBDmRc3VS zqa|ILtlT9h#LFnR(Je;TVb)Px?xbX31j2jVtA=vrE)+5BvmMhp3nkuQ92(_ve5D`| ze0ksITJ^^phY$75xRAaBB7R)2pFW!xmxM~nD@={luFls+etE#}<;d@CY7MK&7Z-Av zG6~7xaiwhf-^?y6-=`TFl#f(gzp?i1mUm-mMcqc$eU}7}{t3@L1{8eKqz2#H zS0%iBxxBRW3cH{GhiIiRQWhp7%_vbOJk;Mmr@F_d{&&lJ%jTJiOve*RrP?&hoeJ&_ z0$L$)e{|-y}JlCUs)xxkXMI* zns+|a2=;^k9F;@}-Sk8tR_vNRG>DR=2)x5g*ZfZGC^;v-g&be><$&u_+3 z@}C!~)6A^*_RQlZ6Dl1tP`Z&E_nn_NJbwoEEs5$X+Ba(Gjb?sW6w*9V*=~eESow&j z=V+d`^YlXF@{lmjzX4kX5lU|$mcJ}cK0-oatPk&`JC&meJ*%Q=W=l4Q(`D8T=ysdl z{2$6(P-;Hv)09@b1~kDynJ~0k*RIuI^WN^fprHP^%kXTln(bB0tM@kLz4O0WcQ;)t zCNE%85*(C=eQLVhHxjK9nLkNjwNOW9i}e&>r;RA60;wuHd{X3v(v;oO4%dU0Q){k}9|V%f8|F`G5Q7ACv2U-+=2.23.2" + }, + "node-red": { + "version": ">=2.0.0", + "nodes": { + "ui_digital_clock": "clock.js" + } + }, + "engines": { + "node": ">=12.0.0" + } +} diff --git a/pi.png b/pi.png new file mode 100644 index 0000000000000000000000000000000000000000..8d01841c8818176759fbf81a558e4d6348263edc GIT binary patch literal 2433 zcmV-{34Zp8P)yLRtKxA7=r zqgw$D$V-%f4iE&l!CsC;13^NJ3KC-?5ilW20w#cuDDeT9AQ2TKFkZT`>Bs_tAQ(_2 zW3Y7_gKdnh9oxEgeXQQC&~@#4@44sEd(Yrc2sgX;e&_qY|DOLpx4r+Z+~sn~`fT0V zhL0}Yk%8H|sl&I;(#js$VAkW3?8wWvT=R- zK;_L2n>HfkK!$F3n35OgjR^@H(e-wmM09XrBJvD0Nyv!_9r6C!;znF}th&SI40O)r z7RwI{#w;Bd$8LXosrlWrx7iKXnyFYW!9qh@L2->gV0z*8KN`)6Vak#m{nUgoL73P{ za$rvS>DrZ6%TvR`%X0NmD#huBPBtk{(1ZrUnWK&TEIo;1ARos`Lcz z516u{3g%S)SdjDIKi|0dVw0OCmP_!*>!xMD)v_D9XqEqRk^Ohq;>a&Dl;-Hi#i{`@ zv6JM+wD}rG!NxC-Dwt5QUI@!l@?9ss#aY&vV76dUNBF;bz`}XNu?(57~ zJX>0=4)4!BG-@TfC+woo3(zkZ*8ZBVkjup)$%|?7;+YVNVMJOShv3OSTO=tagEA_v z>}Blk$BYY{y1<7cLXs1+!`@@-adFIflyoR%$KiN#n`FggP)5a-y}T2N&q}P570&4r zIvfd-+?b|;d*hG;OpD`iJOP(sQWF!kw#4DcB_^-h;*&^>RtH3~BteoJ)8xBXi98$~ zj>GW;&z_PJ6QZ{GlqXbA?%AA9uTQak5{d6{pjiPkNnT9Tz`f|{kQT?`c!Fn7Nr}mz zPE%x0xDyF%R=`Y>7t^n5D=-fyS;q;~7Rib!er@5F#xE-JBNy_Ki&7MlyqMm~CPjvXDN#qH#&H6*MY3WF=CN&-cFhxs z?rra{kf1GB7qe$xa-eyC@>ZvZ?(s#bQ^1~w!%mVH^K`>~p86PdNwyw+I9eQsE3 z6?4EO`>xW+eSWx-S&|m}#q1=r-MROgarMLmEb&|c5HEn1wGnbO<9u;I^!tut{p8*e<{xMjvj|G!@|S*=c&J0FNn zk^}Q>lQ|_yH7X+HPM0IE$Z+lsPbc0MzoP zR>(_p^s}`h^cYh?vaZ9%M)z`y1?1pQo*DJdlwqPcP6eja#AMvd#3JC<=WeI#N~m)-iWgsA6{(Q zcimK)ot7M>!g2|+#qp(*+Ok}p>MSlvaLi9HH}gWdmkq&m{HoDfP;8hvBI4V={&hi^ zfeZzcIxz?IoUxva61q}}n`X8ZJ?E1SCP z7>7f_q)|-4-zBXouiy2c)e*}Vw|gpDUp;vfBOnQqL%?yP)#1LZdt-m)ZbS&P4f)eT zXiQ4Q6!z`pS65ngd3OaPe{tJlad@1RVd}@gPI72C?(-Z+j0(fo{BW4`ipdC6hwKA9 zaYTCkB>4<^&>i=A`UB61P?+?JDR8#nZu>ToxU$9QO_#poe$NPEexZU)yq5~ zr!-8-K)iz{2qcGw3J6X0`o!Cn*ASTsf3YaZyjXRu`>iNY8ER%RgdeX9S z8jMAm1j(V{_{|5;5wg2}&(&j@EfAPgi`fsoy1f4HyImaTm*nX6G3vt1)EACbHCr6+ z3AgclV`*Q*KzaVyaHzKpe7_*Y)a@v$YroOfjU|NsB!i6E*6qwIHgws02Hkt1xvMZ! zm!BFd$Z@#nc-!*vntheVG100+8M=*^b26j?{ zoLrC=doV-it(2!}Gbu8pe#J!D!)>*Fow5G_wEM+}D$8>9llfjgVs*NpqeD9;b}`XS zacc6ivRfU1M^~7v4PACmdr-Tr$MZwx?>#x<*^v+R4}v>gvRMZ!uNr~6HQ6L}?vDBO z2?^Xkyfg1e6?Al{#v~yox-o@W_g9=Cwsy*}-E;fj{q@>}cz4&^jNuU*9{L{yXIJ