From 3cc3929c69a6a62ed083ce9757c332d0ccd631d3 Mon Sep 17 00:00:00 2001 From: EMOTIONS-HUNTER Date: Thu, 11 Jun 2026 18:22:49 -0600 Subject: [PATCH] =?UTF-8?q?Enfoque=20m=C3=A1s=20profecional=20uso=20de=20c?= =?UTF-8?q?odex=20y=20cambio=20a=20g=C3=A9mini?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2MbNe2guV-beaglebone_black_pinmap.png | Bin 88733 -> 0 bytes ARCHITECTURE.md | 10 +- C8ZLtB-py-basic-ui.jpg | Bin 28868 -> 0 bytes PROJECT_STATUS.md | 229 ++++++++++ TZCBIN8qL-HTU21D-Module-Pinout.png | Bin 12080 -> 0 bytes config/alarms.json | 18 + config/sensors.json | 25 ++ data/EZODO.csv | 0 data/EZODO.json | 3 + data/EZOEC.csv | 0 data/EZOEC.json | 3 + data/EZOPH.csv | 0 data/EZOPH.json | 3 + data/EZORTD.json | 2 +- data/HTU21D.json | 1 - frontend/dashboard.css | 505 +++++++++++++++++++++ frontend/dashboard.js | 610 ++++++++++++++++++++++++++ frontend/index.html | 198 +++++++++ logs/do.csv | 11 + logs/ec.csv | 11 + logs/ph.csv | 11 + logs/temperature.csv | 11 + sensors/EZODO/Makefile | 15 + sensors/EZODO/ezodo.c | 35 ++ sensors/EZODO/ezodo.h | 8 + sensors/EZODO/main.c | 0 sensors/EZOEC/Makefile | 15 + sensors/EZOEC/ezoec.c | 35 ++ sensors/EZOEC/ezoec.h | 8 + sensors/EZOEC/main.c | 17 + sensors/EZOPH/Makefile | 15 + sensors/EZOPH/ezoph.c | 40 ++ sensors/EZOPH/ezoph.h | 8 + sensors/EZOPH/main.c | 28 ++ sensors/EZORTD/ezortd_daemon.c | 31 +- sensors/HTU21D/.htu21d.c.swp | Bin 12288 -> 0 bytes sensors/HTU21D/.htu21d.h.swp | Bin 12288 -> 0 bytes sensors/HTU21D/.main.c.swp | Bin 12288 -> 0 bytes sensors/HTU21D/HTU21D | Bin 71296 -> 0 bytes sensors/HTU21D/Makefile | 16 - sensors/HTU21D/Readme.md | 180 -------- sensors/HTU21D/htu21d.c | 52 --- sensors/HTU21D/htu21d.h | 19 - sensors/HTU21D/htu21d.o | Bin 2720 -> 0 bytes sensors/HTU21D/main.c | 39 -- sensors/HTU21D/main.o | Bin 3024 -> 0 bytes sensors/HTU21D/rpiz.png | Bin 108576 -> 0 bytes 47 files changed, 1887 insertions(+), 325 deletions(-) delete mode 100644 2MbNe2guV-beaglebone_black_pinmap.png delete mode 100644 C8ZLtB-py-basic-ui.jpg create mode 100644 PROJECT_STATUS.md delete mode 100644 TZCBIN8qL-HTU21D-Module-Pinout.png create mode 100644 config/alarms.json create mode 100644 config/sensors.json create mode 100644 data/EZODO.csv create mode 100644 data/EZODO.json create mode 100644 data/EZOEC.csv create mode 100644 data/EZOEC.json create mode 100644 data/EZOPH.csv create mode 100644 data/EZOPH.json delete mode 100644 data/HTU21D.json create mode 100644 frontend/dashboard.css create mode 100644 frontend/dashboard.js create mode 100644 frontend/index.html create mode 100644 logs/do.csv create mode 100644 logs/ec.csv create mode 100644 logs/ph.csv create mode 100644 logs/temperature.csv create mode 100644 sensors/EZODO/Makefile create mode 100644 sensors/EZODO/ezodo.c create mode 100644 sensors/EZODO/ezodo.h create mode 100644 sensors/EZODO/main.c create mode 100644 sensors/EZOEC/Makefile create mode 100644 sensors/EZOEC/ezoec.c create mode 100644 sensors/EZOEC/ezoec.h create mode 100644 sensors/EZOEC/main.c create mode 100644 sensors/EZOPH/Makefile create mode 100644 sensors/EZOPH/ezoph.c create mode 100644 sensors/EZOPH/ezoph.h create mode 100644 sensors/EZOPH/main.c delete mode 100644 sensors/HTU21D/.htu21d.c.swp delete mode 100644 sensors/HTU21D/.htu21d.h.swp delete mode 100644 sensors/HTU21D/.main.c.swp delete mode 100755 sensors/HTU21D/HTU21D delete mode 100644 sensors/HTU21D/Makefile delete mode 100644 sensors/HTU21D/Readme.md delete mode 100644 sensors/HTU21D/htu21d.c delete mode 100644 sensors/HTU21D/htu21d.h delete mode 100644 sensors/HTU21D/htu21d.o delete mode 100644 sensors/HTU21D/main.c delete mode 100644 sensors/HTU21D/main.o delete mode 100644 sensors/HTU21D/rpiz.png diff --git a/2MbNe2guV-beaglebone_black_pinmap.png b/2MbNe2guV-beaglebone_black_pinmap.png deleted file mode 100644 index 0fca38adbc64827f613271329b45cfbaf2443a6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88733 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

^V9s6Vn!mn0t(8BPjLXaIBH{crc z?fs;}vq0VF2D3Ek&5VQ^SK8W=h<;}YOiORuvmAnlDNcPodplAqVxf99xFq8wlIQi0$Qk3kf_iY%Iw8VK^r{vuGvqI@ep6Z?nN4X5Y zD*RZ@|8AjkwK)mqQIg~n9kn@^Q2M+x{QJUdU6Fmf`5pMRgPQOmXaT}DaNQqC+J*0Q zO3{TgoW=IDJKi_r%Hr~6kuOU6J~1>3t4L#?yG>k$_nH^7Sz zD|ru(>BJ7Y^c&9!bL;2OfeF@-{x^Sr+~1*m)Yp<2KFJ~0=FY7dzeiK0{f_H*nZG7ERbAEmC!>i~1;M%Fr&0Ex&ETN4& zhdG=5b9b`^82weG9u@E*wa-wK0gglB10mX2$DJcY;~Zi>V3>Z2lUf(BKA5 zaLp~Cp6oG+TdCd%i{es+k*;Zj9@CVk+^tkn#v~91kDm80o|AEsq<7S;G3g4O+DT)1 z#OhPgl#z(V1A#Et90*b!nexm=G)JZ`y|bH``JLc&B?8 z*GUr`ZB#ilIYOVE9Ln$m)dvMV|9D2z{ZMu{T`aRbICFE~8XGzqt+bKn;Zb95aHh}) zv&0X+yM`-h{jBu%vZwT~difnh3)&>-sTT=TgK-~%XSeSaes%QKNbm_TN`QZ3^lE{(h6n@o&L1VSzEdnc4R>M0?O%p#yM zKLsb$KX%kU9`?|ZF|rfpxzEeq3X*zsY&?jM(o6``#wcw@&Zpd^RdP=a#|C*n9Cb^C z`ft&PMGxdxly-5SQW)2DZMOk`3& z2jg^=&EL(Q3{TRm34iqMsqgJk{gB8*JslI&!x+86I_)-N7w79tnRwQW{-|vDlx{am zSF*f^51;EdO3--^NFE(g!^o2<(wdXV`qo%w$IpGEoeT$4Ni4VQE!IpF8r~i0UPsKF zG?}cfC!ua|8tC|?gJ$tGT6bwG+|s5=Ua1+)kvvm;< z(8}cyrfIBJMc*#}c3;*=+?d_|8lNm;MsN8vli){7engL+YPu`O=*4f0up3wnr~907 z#?75oWJRh@JLabVDDi{T*;chL*cdwNZF=#Hr7UPcFj~ACYCXG9yk@i=*n7b)9LNxu z{!M1yqVD19;qdzUdijoqhoXC})_!Y{|1pHW(V4iDkF07?srYk9ep$2?^3fGm)q{~h zGdAwH^8y1j>alRC^~`5IDT?su*LSIQ)xGPQrjdxxDfvk;bkqI_OZrTBNZ|$mX+%l2 z!l}l_`K^I&-P&NqR1@B2X}PJ%9phqKkM8kIpE{e-o9{grHW*655UNxWzNntzZy4OU zB_(Ao=@Irj;N9K~`y98{$HyUEPV~6+NrFALLkt9vj{6Irex;EKA!?y>w%k5WaK#e} z*n0*B{yy8<6PlQTmo3~5oo$=aVEyTs+%@S3ba0&`B@T7NMAm@@!rN5U>K31Gy(G-k z(^NRCP1R&bGcrdtM%ik~$aBK$=})E1aVP`Z`S8j1%*!B&`y(P8t2~0VxqopPwgRwn z&hW=2Cs?~(diQJRa+@9}KVJv=D{cPm7SU+W3i@8QuFA6 z6kx;jAe3_k#J?DUXh1w(jy-=2<|a3f5)~N{aK1)p51AfW-n3e9bnhh?KP4?dE{4`O zI6iK>_Ot%CNsj9}@bYSK;Tms-@ub@&rJQk0ySwDnax0XqKIki*N!2>GV@ro_vU6$# z4Z54+o}4*PY9#d&9;Zyp?T{;tYftrK-_L=WhnoM~Ky{)j(xc(R?x^W*emT-#Z|1Xm z15Qrw2njtYDyvz;D>rMEF>9^pA-sAya3b-9RJz#ktc3$tVA`D)nWH?t@5}pJ0k(5d)HF=Z zo$KphRKxtwZmcJu6G~NtJ(9im!8CW05xx3v@|nT>d3cpBFGfuC7Y{!FMpEc;x2IWyR7DZc%Vs}A$cdTv-v)4!*zEWlR%}0jQNG##juL5<>Kh)y4mu! zMwG?kh$4N3?&jjYm80TWZw9?8%vc>Zc|;X~CTE-GIS-#Ln^w1yU*ByhkWO+)YE;CL zuqP`mr5Y%jxRVG_t{9kXE3qyK(ldZ;Ws8&QE_2mZ<(~y+M0O(9+tCQlw1Iw zX}>c^A)DYDN&Q&_aDl`iTX?>-`pW&}hh^uWJd*r~3l3WtB~dG$uJ&HdJYx$Wx3Uy1 z?aJ|}E+L!fS*vY+0?S>??^lDF)+e@ZMVI)*YsVFTRm(=;O~1C*m4jtq{lZj9zdxL% zR9MeBZ9~}kV;QJwv|q49y+65`9I_J0#n#{-buiEjSHtsbkISd&X9qhiVbZh5Geog?t3ZI~47iQtc zTX2nokkU4^2_RE;x62MSGj0y9mcvwmqWB*gx0`EH*D6h0Vb6{4AV@6Dsh8usfpf=( zO);~Y@bjEg|LkK_W!$`<<1ofaBw12tf3X2#yyHq&5= z&RF12a`DoX`8@pv2W8%&ZFL#xCRXY6>DXvSWDb8YwtCD(L0D^4NS93O6Sl7s5{?HBFxF z&MFH61&$+ZI;e#E8H!|)FlHVC+^ObPquq3zm}v80od|5k?xuajPrgrUh1Q8r(?q=b z{5KolIBO5P-&6+iLTmT?aDs&;#mvCSK;#7uSUVlEc)*3^e%|{cb|iG;O{5Mv8*T`uGSHg>xEgbj>VU)gmNcaQs@cp=n~q?f}DmITb}P> zM_k~bv2NhV2{H8fr@$blKk|}=DH32w@MB`Uwu4Q4Lk0K*vFCPOqU=4~JVA!f!?h%; z-j=tT*zeU*!}3nwk?ON}@7V%)^Ou{_(s z2HY%kh=1(7^MtycUMsg)q#Tw{x_pw((!hd{GNfGhGw=5@#4?6sUd{!M!wC7&k>B(g zm;s}z9!gj6%gaXU4}!RgRo_I{Y?E@Cg(_j}^7=37l5EY9=-t`;W}-+n_YoB|-#wfc zJ@3@elNnM_L>SYrC7hc$khkoJ{rrR7+)R=0lZganbcz@;pERlc90`b+hX~O_H(S*O zpQ|P>tfqN?#=t9!qbJpR{qx1q+W0gAOLNy@=SiQ`4g3neErQHpxwrY`p}fN;9DHZS zhnLJ%&RzFSa1nhHmqwX_x26t{o%V#R6PL%@N3kv)z2-UFmu~+y*o1?(^Rj}LMCyCU zYr@kCTfrs0N=9q@fU~+Qc(4Uj+H$Zw*c1xLUvhOzT8Lx`|f4H>R9q9BlH zWr-DN#+-t8dp;-9bP2zjb&M^A7rKpuxbHwolK*s@2#J6AO1c=TG$?*@+(Wf#s-~n; zxvSbJm|^&MUh{>C3T)kk9IMN8B{pS@W7tk?DV?}{CD=2j^StYAGnz7@VPt3;&a#Dx^GkoFxqG?Ba>2Pu`#5AI;=5)`>u4TnG$j` zg>Q~rErJw5?i69QO-|+$^}f3~<#!mzS<(a}}HO&24A3i&PU z9;@bES>%yrEWZ4%T96(sYu`E?qrWP z-1lUoDo@h(iSLyM-QGB3jDIe1>Ke9e#-Z5}cup4SQj=_Lm;?93emPWPVFCW|tI-(cwPJ$4G>C_Zzi1=$bndf&?i7lco>5 zgGc`Sbkk-0lyvgWr97vW2vZS?wR?fctS)Va&%8`97=Q`R>nrU~n6OtUGZdohLf5Ao zr>$`h$2xUDY(n_)DT{GJUR657HEp(GIJH2i$dt>JzX_jrt^k+-m1D z)0R_&MT(hn{Lkn~JQ$hl7Chr|N1b&R*%b(>Y)tXwm`)P#Ecwkp)so1WXwp|@EfM=T z%SUvX&qRZmR9`U`5DhUpG7%GBIJOURz>f4GRN%-vBV4`jDXo|x?M(QGL=yYEuZKTj z1>^Rj#ebBQJX@x*Xxm%aFygl0d3DA9ACa=mQoc9Soc^}m+kE5F#fmq+703M>yBJI8 z|IqZ+VNt!$+bW78-LZ7{5&|L((xoEOE1gS89?GD*B}I`2X;}mgpdzqKh)A=r)Dlt) zOP9X;`M%fh-@UFqXP$Xx=9y>ap8G65%ZSsg5)0`0#iH~^Ur}v-@K(D{J6T<_e0$Ae zujJIEuocVqB>FuD+d`Tczs`-Q9jR`ioDAA>-h9hOTY(AU`e2Udw?{NEDIH#K$ZEOP z-~9ooBnewC&wM3Dh8V~?WFBHEBi%oBU`A8@uPK>h~~^A zcMVu;cY4l8QA`~UDl^UM5UM`Qu+;T$ZOYu`@7}C(`pNaZzHRU%R&`(B7c!4% zrUcdpd%ss>1Ufi3A?E?o+*2UH#(nbaL6qwR zT6_x5x0~eK9LChS)!Mu-JWN2*VCQ-8PqZ<@gI}ba8iW7+#rN#*@6W7yeAxXcs5u!; zbXzk1qfT{wG8h3>u2~Mx1#OD2A9`3a+-eAXy>rbikp^i+r)l%R>Ulm_ki49Of#{x#>m0v(t;Y7ZRa-O-n$Nymgj^;Ciypf>^(oVtJ*Q}+BSgaUu3(&Cj?$9O$o)DQBIM0q>Ell?y&Pc#E*6EBrh|r#hb{@UlOL zM}jAKp#1D~|A1h5^Dhv&_O#QPQ<*0(dFwrduh5-WBhQz17XC(0{Uv$-@?cmcX5oqt zdj$=3VVuJ0g9c}>HLymjOHDFxJ;sY@bh zE?SlQO7d2H-Qkil{IM2Hc2mP=wLB8kJlyrzWIq?DsviwvJoUmU-Nml9$K)T^Aow$L zcp+IEoIZ@mt)sZ5#XZ~S!gMJVF-`K;9NIj^yEO91(>Il7+?My8JU#2I&rf?$ZEd8D zurHqa`h{R2XvhiWsU3}4K_r7&P625rR`@?1o~?_)jmxwM>h~jZ-!~b+_96%V1o#BY ztiYd-b%|}Pd{D@d2p;i73-;Y=P4T`ZZ&v}ftW*0n$O^X9dcMb!GhOn9K1s{46`lK| ze?2JHgnEuPLV_ug+{MI4sLWQ}ygZ)RQ-2;oIu5mPeZ0(k)1;Ow-i?b=B2`8!%K6>|o!I>pPWwgky~QNT2MJbCG3 zo5U7R`kgm&8C%7aIZK>1P36tu({}*haapFLNXRs}#f#%nd=;edBZ!d?y5DBIr9^{W zrQN@VR8SE8s7j_u@?hRF*EJ|!QSO7js?{}bDz7SudJ)aYnMblr24!zXU-cIlt(59l za}Wh*qQ-c4qt6&^SLr+s82OF=&h*VMsPw6GH2rKAJ;=?;Y-PsIzwW??Qi-eyg++Z& zX|PKVa>0cLs$;yPdsSNI+qtP8zRffna}?SZZ?SDS)T`8(3cYO-9v&G5PF8weTZA}a z19o2Frf&9}d~DG8e*9)4lovTDV6D*>Q|Da18@fF4*OZ_3nzeOkRcCmBsZ#Rue=I@` zztTHB4h{}dIo9i6-jkFJdaam{CZn6lOTCMsS+7aXBa<6D5fs4r@TbXFrO z)S`HM?{I8q+Z#d+n-eGUva0iw5hf>vvTO52QbPajRcv%U*{PRA81(Mq1ws=O8hRcf zh+S=qnf><|ZK;nro;WtY9RTNElhzlwc5_ZszJM@#UDj|5@#jEa#9QVAH$9?*xHe<;+e_@?U;9Yjw`+6#_JT zLlPEyDVaFJR)=IoNwu1apCGP}2mwn$7jaIIQ_)XuxYk^dchjcVg-rMdnCtb`@Sd-V zJ^os-SnOP{=_s%6k5&Evn|16e*7F9C_M$QG zCa&zR1OO90k&8->cmz*yPGy$?Meq=P*wM8FINdFd)8%sY>m16hk^1einK_w3@3DN( zd{z%M^-YPf0XFmorp(8aCBmUP%HffJzCP1?>SX?%fp`efee){?`S4Ez19B>S%$uc@ z;+bNuJ24d_21J0;z~Z9q^XF031JjkQNc3>_3sdG0v(HbReqHAkpANOshZU`O-kY*b zYn9K?)`Dpq1oxH$g$9S5A=IF*sZoj7Yp+3V2E7XO!*n+NFl^aj+;yP}TU%9>hame1 z$=m6|jH%NFM`89`Ci~Mi4JR+~UBg&DIV`Y9UsEdh>kMyLl1(Q;&9z*s1&dD)BC$t1 zHt{I$NTCYIPWYamw>sm+dF$g8%*ySPK=`;j)@dfH#-KwVS%4#6NHyTQ_5O{_PUlHY zW~)$!wjNC5-IpfUF-7$u5h!0K%G5ekg*?eHlx^+ctp#U(WbTwc(qltV<$kQ;H(d<5 zl$xZ4HvPH|=H?lL&~%7Au<#5&o75LW9ut@Rl+uHS3o0?$t^5`_i&Bt^=*K-zFv07k zk4u<;UfNue!(V+x4X#_3v=QG1BxjCTtpI-D;f`JqQI&)q>}|^n<>;?)B6nm?h@+|D z$+GMO8{)lB{YsW~LKIIs-3M$-A8)I(6Sg;L>cIFzwo5|)jrb|jXHWsC0FLVujgT~6 z-1Dq8%E0Hl7Usuv`2x<*1iyJV3XF_Y>UZd6ErM6NW!J=X2rK;!*JzaI^X^^mR>iPe zs)!C&KNA;AZ5y0e>ye-1ElQiJlBrk4uq|=OI#FdXt{lCY7(@-CLgTQ8^%qx8*em-3 z3Lfu{N^NeX1g858*wsbP`zS&*?CM=321H!h1yn*OugIQb8%PlXKxoNb27YP$Y|C0J z;Sso5*|X&@eR%L53~Ju_pX1%`dX`t-sOT-Fq|Bd{&bU@y|2{)b;E&_rE&@6gRYYJGIGHQk>!4e7a#7=K)T*PGB^!YSFs-xg zeO>UPPk|$Xb;WGLOAe9 z_Am8q?;1by?9b#6C0%vcqaXIn65la|s=J0UuHsM4KZ96C0O#9>7ImBvRXS*r$~#CG8N?qc8-vgTfmuOXo+Zj zBzVD40Fi+kc*4{%ulfw|*ML~A&+~6CpeJ9MGr`egxa=|Q%^rX;O|Dv)yCHv~L9!O0 z$43l@^&fvs%xG1sl^1}f0vNbYF2O_-h#ORTEhw*rbVRuZ}$_ks^d>NnC^jjC^-% z)8hTqyd_?l#83wH^Rm#m+48uVvIdQ{t3|*1A#-=?4!|>V`M2>2zV6~`DntbAA470Q{?@iho51SxH8IpCbq-~($GTO6srkC=!2RV$7Q*{P(4%!$vs(Q4QI&N zIl*;?;{j9#2ifz_rw3vu>NzdL?^82_yY$_RHDo3@8QSQ<7?PoFKadHYYh$&9z{8 zKpr@O9CYzq(x+_wd-(f_QSFLm@qx<8K5NR+8ZdmMQ8!&Z&4xAIOaw@PWC8e^oDsyMRst`+_*5dMonSp_rZvcOL>xFllc?$L#Dt{(20@Lw`v zmR>wMC&SynGoCeq$rG9NW%2`~QkfHdhspO$VG;OOJBk9{iS`&3nvhYn|Aknn%Q}go z=oG!IGP7`vJv13u`EtU?h1-Us1~zuT1h~bePYucDmcZKE@D1ERRS$F<70W2#+Eu!r z)_MR}*XG_h{T^)*(9~~Fk@~SRjrQ?3Sn%Ld|AxRrL;^zaTfnvwW~~1xhxWFI%lmHh zy^B?L09G%CrYg_xKdo}h1jFy$k4rTwuKuL`1Fli4BouMsMeB)u^{>b{>{wpFTf_nL z^QcJ?3hP;5Jj%>5ZCt3%U3bEgx48@n7hCul-wm{L_J8FH0Vio?9mby%jn<@1?RNM! zQHL zNnY+zW2*~!YJ~YmiVvxLmHr8ph?TjQdeuCZ1b)k{dQ-@4JneHm ziH#(`RE%(}&g0p{ajQE?j{wQ!c za_PF-oT$kFy-NX2^Q;}32D-|Jg^ax`US-p)rUHP%3YY=bPLj)HO1;#mD`jGPq>-~8 zn$Bp(v5FG$bdg7!-d?}`^7|!=I}E+=d?P97R5v5)3m3O{e?)d`39o;3;nd1~5_Dm# zE=?#CZ>cI*YKGw9jYnVS4n(&SGr;~gpc-cvln=0Sc+lM^FpV8$Nu4&%dv%Wu9I_~)f>JDu61G62M(g3sxwh^|NAX7ak5aY857&}1Ud zlKs5^l%;Uih~uUPUq>$-Hx8yu-6ih{{4SxR$cSq`X!K_C^ya@Q1}D~~(_R-7N$3%D zBgKE$&%K#~L$o>Z#Y=}b@!}de>lxKZ3lUsMg||QDl7c3Md$<_uZYEo2wDRI0eZb4~ z_-tpQPCBpYv%(#^pX-KOv5!8S0F?M5CU!QDZzl79;PWw$nV6MigtlbO^TJ?9R=A)v zImr4|+A2|JWq44+45k<$%#9NlTB$kWe`y4uDKr?#5?+CY9gmlZA7k&QF9g!Y9&fo5 z0pTN()lB(5&KVo$wz`-VRg6V{Q@{(2;&V`(lcf%dvdTCiUjgs+#7L#vc@YU}0!izt z_x}dRWz)T&S6EwU`Z-5zh>><#Up#En(#}R&5W;7xRK8h#YekQjFU(0HZqepSEdfoC zC)xeioh0E@?!=DQE=-eWUy>PaaR$8p{@B*iZaJ50-H0j9J6>3Lnb-eQV2927vqP8e z5W}<+VTV*$;>iU3cF1AhbfA-=zbS3c@<4Jx$a7i^tK~WO7*MV^FEJ-(JT&v0j|tiH z-@)g1JIr>GTTp+2`T?M{bv*%;^*l8(^~KyEj0?Sf`k5*=_gwV_ z8H|$XT4mg;I+{G2p5w@(dbCRn`A#_Ap*-^ANzeOIAh~+s4m>h8-EE?0T4EFS@FOx+ zW2)i%FK;Wg<@;(A5037K0tq3R0`*Ky{8j!jS_OB z8%>Wm<2Hu9`fAF1i~V0@#0`qQgk(|qI54SJ@m35M5N|p75YwMTJ>%u3IB!+{cRrMC z!K^*Q%t-)tuJo7f%1{%c-d~j`^D{A1t^_b;Ck$eIP3mU_z9B1I`7%y!+z84;>MxM0 zT6kXAG_YNq*lwW7(ofRN6!MWZoj

bz7mv>EZu51wb7xXR!{YtTMSc$OI%IIhjB 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%0A#9GLGppq7t~p2EzpllBV$uyp|) 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 | `/etc/nginx/sites-available/default` | @@ -322,7 +322,7 @@ Retained in `sensors/HTU21D/` for reference and backward compatibility with `ind | File | Writer | Reader | Format | Update Rate | |---|---|---|---|---| | `data/EZORTD.json` | `ezortd_daemon` | Nginx → browser | JSON object | 1 s | -| `logs/temp.csv` | `ezortd_daemon` | (manual / future viz) | CSV (epoch, float) | 1 s (append) | +| `logs/temperature.csv` | `ezortd_daemon` | Browser historical chart | CSV (`timestamp,value`) | 1 s (append) | | `data/HTU21D.json` | `HTU21D` binary (manual / cron) | Nginx → browser | JSON object | On demand | | `data/EZORTD.csv` | (template only — unused) | — | CSV | — | diff --git a/C8ZLtB-py-basic-ui.jpg b/C8ZLtB-py-basic-ui.jpg deleted file mode 100644 index c13d47cc6707c0c25a50a5b918fd3896745937ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28868 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 ASO5S3 diff --git a/PROJECT_STATUS.md b/PROJECT_STATUS.md new file mode 100644 index 0000000..9734f16 --- /dev/null +++ b/PROJECT_STATUS.md @@ -0,0 +1,229 @@ +# Project Status - Photobioreactor Dashboard v1.0 + Phase 3 + +## Estado general + +Este repositorio contiene un sistema de monitoreo local para un fotobiorreactor basado en sensores Atlas Scientific EZO. La arquitectura actual separa la captura de datos en C, los archivos de intercambio en `data/`, los historiales CSV en `logs/` y un dashboard web estatico en `frontend/`, pensado para desplegarse posteriormente en Raspberry Pi con Nginx. + +## Arquitectura actual + +El flujo principal del sistema es: + +1. Los sensores Atlas Scientific se comunican por I2C con la Raspberry Pi. +2. Los programas en `sensors/` leen cada circuito EZO. +3. Cada lectura actual se escribe como JSON en `data/`. +4. Los historiales se almacenan como CSV en `logs/`. +5. Nginx sirve el repositorio como contenido estatico. +6. `frontend/index.html` carga `dashboard.css`, Chart.js y `dashboard.js`. +7. El navegador consulta los JSON cada segundo y actualiza las lecturas actuales. +8. La seccion `Alarm Summary` evalua umbrales desde `config/alarms.json`. +9. La seccion `Historical Trends` consulta los CSV cada 10 segundos y actualiza las graficas. + +No hay backend web ni base de datos en esta version. El filesystem funciona como interfaz entre los daemons de sensores y el frontend. + +## Sensores y archivos de datos actuales + +| Sensor | Variable | Archivo JSON | Unidad | +|---|---|---|---| +| EZO-RTD | Temperatura | `data/EZORTD.json` | degC | +| EZO-pH | pH | `data/EZOPH.json` | pH | +| EZO-DO | Oxigeno disuelto | `data/EZODO.json` | mg/L | +| EZO-EC | Conductividad | `data/EZOEC.json` | uS/cm | + +## Archivos de historial + +| Variable | Archivo CSV | Grafica | +|---|---|---| +| Temperatura | `logs/temperature.csv` | Temperature vs Time | +| pH | `logs/ph.csv` | pH vs Time | +| Oxigeno disuelto | `logs/do.csv` | Dissolved Oxygen vs Time | +| Conductividad | `logs/ec.csv` | Conductivity vs Time | + +Formato CSV soportado: + +```csv +timestamp,value +1717027200,25.488 +``` + +El frontend tambien acepta timestamps ISO 8601 en la primera columna. + +## Archivos utilizados + +| Ruta | Proposito | +|---|---| +| `frontend/index.html` | Estructura del dashboard, seccion `System Status` y seccion `Historical Trends`. | +| `frontend/dashboard.css` | Estilos responsive para metricas, estado del sistema y graficas. | +| `frontend/dashboard.js` | Lectura periodica de JSON, validacion de datos, lectura CSV y actualizacion de Chart.js. | +| `data/EZORTD.json` | Lectura actual de temperatura. | +| `data/EZOPH.json` | Lectura actual de pH. | +| `data/EZODO.json` | Lectura actual de oxigeno disuelto. | +| `data/EZOEC.json` | Lectura actual de conductividad. | +| `logs/temperature.csv` | Historial de temperatura para graficas. | +| `logs/ph.csv` | Historial de pH para graficas. | +| `logs/do.csv` | Historial de oxigeno disuelto para graficas. | +| `logs/ec.csv` | Historial de conductividad para graficas. | +| `config/sensors.json` | Configuracion declarativa de sensores Atlas Scientific. | +| `config/alarms.json` | Umbrales configurables para estados NORMAL, WARNING y CRITICAL. | +| `sensors/EZORTD/` | Codigo C existente para lectura EZO-RTD. | +| `sensors/EZOPH/` | Codigo C existente para lectura EZO-pH. | +| `sensors/EZODO/` | Codigo C existente para lectura EZO-DO. | +| `sensors/EZOEC/` | Codigo C existente para lectura EZO-EC. | + +## Funciones implementadas en v1.0 + +- Dashboard profesional para monitoreo del fotobiorreactor. +- Lectura de temperatura, pH, oxigeno disuelto y conductividad. +- Actualizacion automatica de lecturas actuales cada 1 segundo. +- Fecha y hora de ultima actualizacion. +- Validacion independiente por sensor. +- Estado `OFFLINE` cuando un JSON no existe, no responde, contiene JSON invalido o no incluye un valor numerico valido. +- Estado global del sistema: `ALL SYSTEMS ONLINE`, `PARTIAL DATA` o `SYSTEM OFFLINE`. +- Seccion inferior `System Status`. +- Conteo de sensores activos y sensores offline. +- Diseno responsive para escritorio, tablet y movil. + +## Funciones implementadas en Phase 2 - Historical Trends + +- Nueva seccion `Historical Trends` debajo de `System Status`. +- Integracion de Chart.js para graficas de linea. +- Cuatro graficas independientes: + - Temperature vs Time. + - pH vs Time. + - Dissolved Oxygen vs Time. + - Conductivity vs Time. +- Lectura de historiales desde `logs/temperature.csv`, `logs/ph.csv`, `logs/do.csv` y `logs/ec.csv`. +- Actualizacion automatica de graficas cada 10 segundos. +- Estado visual `No historical data available` cuando un CSV no existe, esta vacio o no contiene datos numericos validos. +- Parser CSV reutilizable con soporte principal para `timestamp,value` y compatibilidad adicional con encabezados como `time`, `date`, nombres de variable y `reading`. +- Las instancias Chart.js se conservan en memoria y las actualizaciones cambian datasets existentes con `chart.update("none")`. +- Configuracion Chart.js para dashboard cientifico: `responsive: true`, `maintainAspectRatio: false` y `animation: false`. +- Funciones reutilizables para futuras graficas: + - `readHistoricalData()` + - `parseHistoricalCsv()` + - `buildChartDataset()` + - `getChartOptions()` + - `renderHistoricalChart()` + - `updateHistoricalTrends()` +- Diseno responsive para dos columnas en escritorio y una columna en movil. + +## Funciones implementadas en Phase 3 - Alarmas y umbrales configurables + +- Archivo `config/alarms.json` normalizado con umbrales por variable: + - Temperatura: 20 a 30 degC. + - pH: 6.8 a 7.5. + - Oxigeno disuelto: 4.0 a 12.0 mg/L. + - Conductividad: 500 a 2500 uS/cm. +- El frontend lee `../config/alarms.json` durante el ciclo de actualizacion. +- Cada sensor se evalua como: + - `NORMAL`: valor dentro del rango y fuera de la banda de advertencia. + - `WARNING`: valor dentro del rango, pero cerca de `min` o `max`. + - `CRITICAL`: valor por debajo de `min` o por encima de `max`. + - `OFFLINE`: JSON faltante, invalido o sin valor numerico. +- La banda `WARNING` usa el 10% del ancho del rango configurado, definido en `WARNING_MARGIN_RATIO`. +- Las tarjetas cambian visualmente por estado: + - Verde para `NORMAL`. + - Amarillo para `WARNING`. + - Rojo para `CRITICAL`. + - Gris para `OFFLINE`. +- Nueva seccion `Alarm Summary` con: + - `Active Critical Alarms`. + - `Active Warnings`. + - `Offline Sensors`. + - `Overall Risk Level`. +- Lista activa de sensores en alarma u offline. +- Estructura de eventos de alarma preparada para integraciones futuras: + - `sensorId` + - `sensorName` + - `severity` + - `value` + - `message` + - `createdAt` + +## Arquitectura de alarmas + +El flujo de alarmas es: + +1. `dashboard.js` lee los JSON de sensores desde `data/`. +2. `dashboard.js` lee los umbrales desde `config/alarms.json`. +3. `evaluateSensorAlarm()` compara cada valor contra `min` y `max`. +4. `renderSystemStatus()` actualiza el estado general. +5. `renderAlarmSummary()` actualiza conteos, riesgo global y lista de alarmas. + +La logica queda encapsulada para que una fase posterior pueda enviar los eventos generados por `getAlarmEvents()` a correo, Telegram o MQTT sin acoplar esas salidas al renderizado visual. + +## Dependencias nuevas + +| Dependencia | Uso | Carga | +|---|---|---| +| Chart.js | Renderizado de graficas historicas de linea | CDN en `frontend/index.html` | + +Nota de despliegue: Chart.js por CDN requiere conectividad desde el navegador. Para una Raspberry Pi aislada o una red local sin internet, se recomienda descargar una copia local versionada y servirla desde `frontend/vendor/`. + +## Nomenclatura de historiales CSV + +Se detecto una inconsistencia entre `logs/temp.csv` y `logs/temperature.csv`: + +- `frontend/dashboard.js` consume `logs/temperature.csv`. +- El archivo presente en `logs/` es `temperature.csv`. +- Versiones anteriores de `ARCHITECTURE.md` y `sensors/EZORTD/ezortd_daemon.c` apuntaban a `logs/temp.csv`. + +Nomenclatura unica propuesta y aplicada para todo el proyecto: + +| Variable | Nombre canonico | +|---|---| +| Temperatura | `logs/temperature.csv` | +| pH | `logs/ph.csv` | +| Oxigeno disuelto | `logs/do.csv` | +| Conductividad | `logs/ec.csv` | + +La razon es mantener nombres descriptivos, consistentes con las etiquetas cientificas del dashboard y faciles de extender en exportaciones futuras. + +## Proximas fases + +1. Historial CSV persistente + - Unificar la escritura de logs en `logs/` o `data/`. + - Definir encabezados estables para cada sensor. + - Registrar timestamp ISO y valor numerico por lectura. + +2. Controles de rango para graficas + - Agregar rangos de tiempo: 5 min, 1 h, 24 h. + - Permitir pausa/reanudacion de actualizacion historica. + - Mostrar minimos, maximos y promedios por ventana. + +3. Notificaciones de alarmas + - Enviar eventos de `getAlarmEvents()` por correo. + - Enviar alertas por Telegram. + - Publicar alarmas por MQTT. + - Preparar salidas GPIO locales para alarmas criticas. + +4. Exportacion CSV + - Descargar historiales por sensor. + - Exportar ventanas de tiempo seleccionadas. + - Mantener compatibilidad con herramientas de analisis cientifico. + +5. Exportacion Excel + - Generar archivos `.xlsx` con hojas por sensor. + - Incluir metadatos del experimento. + - Preparar tablas y graficas basicas. + +6. Calibracion Atlas Scientific + - Crear interfaz guiada para rutinas de calibracion. + - Registrar fecha, operador y resultado de calibracion. + - Proteger comandos criticos con confirmaciones. + +7. Comandos EZO desde la web + - Agregar una API local para enviar comandos a los circuitos EZO. + - Implementar endpoints seguros para lectura, calibracion y diagnostico. + - Separar permisos de monitoreo y administracion. + +## Notas de despliegue + +Para Raspberry Pi con Nginx, el `root` del sitio debe apuntar al directorio raiz del repositorio. El dashboard se abre desde: + +```text +/frontend/index.html +``` + +Desde esa ubicacion, el frontend lee los datos usando rutas relativas hacia `../data/*.json` y `../logs/*.csv`. + +Chart.js se carga desde CDN en esta fase. Para uso sin internet en la Raspberry Pi, la siguiente mejora recomendada es descargar una copia local versionada de Chart.js y servirla desde `frontend/vendor/`. diff --git a/TZCBIN8qL-HTU21D-Module-Pinout.png b/TZCBIN8qL-HTU21D-Module-Pinout.png deleted file mode 100644 index 0a839de5a5b29bb129947b05bbd4f09b9ee03a22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12080 zcmZ{KcQ~9+)HV@BCrU(Tk?3`a=)L#oE!tuiiQc03AbRiJ>TPur(XDPRRuG-&g6KZK z_xt{PukXI@d9IoBoH;Xd&YbyUo+nyMLy-WN3KtCxjX+sRP6rJQ9rjdgUtl~*OjII% zprK))X{mjXM{_88B09JT16+&=DaLdx!E`Lfw#&w~Nx^r>!TVG~@VSi0rJUHcoW!ky z+yhGKSxN0(MekS5^reP5pzcjjJzH=+XGlGFXoFyQgFsvrPiGJ}+=XlG^AowpT)4+w z_{QCYC%nX`{1j$_b?3fXEv7jA%5nRZ7lTSdAl?4W+T2WN-3$ue4Dwy~^B+~%Zp6o| zM@Ov&1}=Mgq8uIPjEtt0lqSW+$ALgNH#eMJTar1KV^6~Hs z3JARueBwJ1!FTUPL`5Z~q-5pfh+QhHz|BS$SWCqpwUGjj{`kCq>8ZLMr=t)HGCkhPs1$lk#Y z>}cWSYwqlC_1Vwa)x+Jx!_&*#%h%t@@9XElc-N3buh4|xu*k@$=$M$8Z}IWT$;s(y zX^E*>p~(d{DRml2t%`~5atR$WN!`FSlwkT2Fyo28L^6L##s86x_$wQ6E*E*OmGDCuX)R3|1?Bk#g+)b0rDf$M6*VPQjny@E4UJ6=u#VQYj;@Z5 z{u^*eHB#bbJy%IWsXeJvB8o{eLkt zGyOlDdBW^}m_r~I5QycuxnD>mYT-Z3&(F`z&ri)Q_RMXx&u?|iZ?(*Awjy_Xm-mO) z4&dvj@b!bSjX%>n>vLOc3#%&&ODjvimRFXSS65fo)>hWn*ETlRH@CL7cXs#w?C&2O zY#kl19-b{9oUa~UY#jgF{d;|QetmLrb@un~>DlS|*}>Jt+2!TM)%Eqw&CT82-NXOF zS4apdCn+5kH@HJuQ+_2>h?B-x_`8bGXR zjRwXvwA^50ILdfGIOpajw5(I*_1!0wJq~KO!Ip9i%2H;c%yTlkP7t7hK%GLHyM$;z znGeoU^)?t@B}QcP%zlAz+S$IgrGYB?-f~N(HAK6mw&vlY?v~k2g3pM8Sae=-58Cgx`P)f%R+c~(TrEpav+$)Sn z8*$!}P3aCg!(vuZ5^0WPkZ#l|(Y6z_W^jzf&USaZ@`sJE{x~eoydM9=D&g49IbJOO z8ev{QWi*34Jt?|Ru-aJ2Rc^||fW0bLP*Ds?SAPS?KGMCeO2me}Doq=Nq{~%3z+`2} zezS(4;Myh}skl%ZOWOH6zx-b!4yn?Ir4_b#BV^o6rv{h91S65pEBxJnbstk2M_|t$ z*tme@Ur^l-ho1$h2yYB>q3Q8ITV1l*E%c?hvQWP49JmmjU_k{P9f;#>`|Cm|zMtJj zE8%P*7}r9It1>Hg-@k!5k#^~M&1|5QK>K$Q+V~dc3V##WGc17KcjnZyjlBl1_`KoW zpMl?dYs%)#CriqLjU8cn4RW57RubuFc!`r3WC_&yhqUEcmo4D2{x4M_#$$J~Sxi;W zjG&iyi!Nc$1U@!xDzas8a=@*Da2+!L_mW@g7UrU}ILoD+PVcfAX90VsI~tTITA4LR z?B0vO;-&jVJLr7{<#(~K(&m5v+O={hYGJ@$(t(U{0wMK#E>YWM$CHU&;JG2No|cIM z@aOj1Ob2`|CEw~ynl?yPe*R=dx6gQ^Xz}IHwGU$mRfX;F9*~ejzE;by$NeW>()bX# z5otZk3wSkEQv)ZLtBYD$0vW(vKR(E9qFL~)^|hSH)Y z13o&l4lWq%&~*>>SBRiG{#fN!WkgPKo0wH=ebt;3UxD=o=!5GL*EWNb%_Qst9?l%^p{TE(yAxrr_4>_azY+p>C!zogRUswZSM$~Z^J>tVnsoGt(p%|<(tT|1v1 zn+1}Wsq$zEIPDg%J_sg9S7L#2=2hukwv*_ZS-?ruE8BO>&E>$AN=IWNVVsrxLOO0dFs#e-Qz>8^}4}wdV;%jL)vi83QzSRV`iY4 zFyu;d4k|S%nP&{{^@y8Dh}1@?nbf_*%4FThLr4)^Pg}Q1=j^%8Cur69A||Xe*tQ#((v%ge`7T;x}M{Nn~Zb;<6@hy zzy;f@Q&cC%4a=*qv;j*31Uz=64Np@2vX_V0-wHid-V7g8XbE^wYsP+qip*_6gHcti z{}gU#z6brN(|2L7EUapaDdlmg4$cb9@)ug~0=hO*$z3`J2Ks>@hYQUw8|(xFmsTeS zp7!H&YR5w!d*=wdS9DP-w_g9?b zOrnDPqTB`qh%kkB)Y5p}KBl$vt*pEeUU$k5Y!*B7zT(uX1c-iC()Ko@96JAIz|nVd z82((pRi)F9)vpqfSz34fYVTXobE|bPgUg0%K*m7bf#l+{5L8nI&auDHzduLO!N`kM zC*^19S!Ibut4ymWns5UQnDX`UR!;$; zwv_Jz+Mv-|Q@uw(5ZyL$XdmqXx%bCU2@NX#hGYudOH=N8a@&0wxb}2c>MGDcl}tm6 zm9#wND3oS-M9af{oh2wRpnbx{(cj0+7bFkZbo2+CKZ@C190skEs- zRi()H^oVKSE+86Tq7hnb*#CWYLcR|-(2{@I<#I74eNU0wE41@HflAxW8#f$_q3`Bw z2XSEWlrwl2n{~wsh_*8U@}N6{`uMz*I{D~RpcC4R){K^XOuT|x3mTw;1Srt4M-*j% z;%8n{Tm3m{YAbDEy|B<2{@s9PnoYD=Uur)SH^F*_N!4hsNwL z_n_y{=neDyKrsNnJ-Wq~Dj-gl^n@tr3kHohs0L+Kg3h>jmKSs&hMAYGl&i1G2B|9+ zVBN-f`} zGWipz`(>6&pFr|z786WGrJZe`n(GiqU66+H`F4-G!q5hKL2ZKk{N-!nSEhkJ1iQVw zAoIA>0pv-bxyOS37s7k9GAnDM++$pI^f; zFO}SHKO`G+j5!xQ`?Qr!{rz3KI>PE8arYn8T+u1dR7kr|y5YzMakY0t5`FDoN&8Ns zXm2@#6BCd;a z1O|u)Y&XHUzc7zKzRW99PT!tvZ|Jzz*>251Y2PI}na1~1SBxhqYnH&G9sv@q0i2FKG>UD5X9N$Cn_&I0c0;X&Lx z1D%Z^uSSZ|%qQDiZrAW|5e@IKVi9$3abP;G(}I|hb`fiAq@3@E{*5qpD!y`@PX!?N zfM2b`c)%iLP*eKyO9P~0Hz~vy0G5nIQ8c)a#~ldC9X4&w=OHOW`@y7vXEyU~#C3RJjt~{i2!&a3N~>xQbrts`sJ|MK#97EE#CF zn3RyMTLgavH=o`x+DBiooceLUjHij0)rrj(C74r^GPUY=@l(F-RlmR1=~_hP8nQKI zYBsS*S5)1ZgMTrFW@(beO?9Oi498|3!$~_yA>^IK{10LG{s{iVI`#I|?4=DT39Jj< z-gVnm0RGnKCf87e<}R7*q_aYqCLp|9JdaA-T1Q}i*s#+q%UM&jfqD2yf8>B0+)fA@ z%~6+*tKe%D`L$#;H2wE$qQ8>y{>Th@VDb>pCeG26KjlmzTE zgRe88X(9=X4e$uC5HB+RwTu81LaZx{J{QkJ>18bw%^q*q9;$mR0JdmIXUy`;N^gjzKz8Fv|64Id-(esaP z8%w3J!bmjP267%UJH;Adw|VqGy_BGG(X+@f2RqG{Z-T&nL8LIL>q$30H!)yQS#v^Z z(cpxy$hCdRkCVFf(4|nqpXk+*WZOL%B573GqSDvqKlw~A!e8|k&2{Zte9@{rh{=?5 z8oe-nX{EnD%vwv*fHsl;?v+3^>iileK`|a1Svu4q5PSg*x8W-i3NV+weXqvVM+_Jn zn}^L#sk|Fgj;jby=F~En=sy9dTe1$7(c4B0jO{&zBpV6A%&8tP_OjqlqSA&p{%bMV znxiHS&a6W(-tkhLsm~Azq0+wHx_sJW>|nstwww!S#-*OrD(PxY1PauR#4zDG3>l{3 zSm>%KAO`E^v({Y|V)tADukEP^%ix(tH4XT=k~JE)igI=r{*fdwtTBn4`%+gvTJZSi zuqfsPvswI5+ql6I7Z#!bZ93JqeUvTXYB(;1MgDA?evPZG;7r z8sGD8&TmZTAVr>mf=T3~`KCCVJ+ut}V%n`L3e$P%40q|Vh<$NZ;P0F|CYBh z-x4o(Xb#>5)htnoQG%O)T3`@W4E;LNB!CV94IZcI%6DLMpx0cpK<&;Lsv|dn@?;rp z=E1*_$%3Y)TCWA%Mgi2m%6@-9y1%JDCR>TXE~4zi&LFU^W-HR;e2c!jY+8)Iec%*1 z)Ax0DONY)ym&;TC7h}`$w!I&fdl5`Y@1XK8~v)2j%~?o<69f zLLXgpPs0{BE12Fw{8Ieo^+bv;08F2sb(|O_pQlhcBzI^rDI<0V==k`!DRVL)&qOr2 z?&EP9ZS$t_;I$vKRbn|GA_}$rc#zxcT=kADLOvTb{Z{?x^IS?K!Ja5ti%qZU4|QFi z;Gabbf3XTjna8b!;^bsXm5?8)!M9RCfENf6{y2~-quKo%9{5cp$J~#k=Cak+B{#D>81)#HJ2VzC)^Y=7$9JR%?PQd$N1^=~rKAJU zBMrU&>-udiQ%syUk2(n|LtK&c&(4|)Sn5~^*j)2sfd3LAP?~Zu5z<-!C|_LlrKS@m z6t+b@kVnR6n|@h>G(ou@jE5lk8-~A$>c?jl4pyfn6XhC4+|FU^tHv|ggjRqO_N$`2 zA(@BhH8XPpk*o_mitiElFt~-_b#BxY-AzA+l2T^Ks3+W&Gw~eT+Lg;~AhU5;)TDo| z5LB_;c&B93u(StNP+7r2mxz`Q`9-RXDJ5Cp_t4CoClsYrdZ}S!8J@MZt_LA;0!L&4TBzb&6Bw=A=6+MB*=jD= zk;%;%iODw=(q&)D`e>@5f+BYcmT8lvoT)Gyu}M^JI8eBg<+Hag(@V}G~8TmRxa#nx#( z)S~|m1naGB`81^4U_A*wzh68#8U#o9zBTmC)idP*7d8)en z7PMn#S7b(oIEo#bM4;v?rX|C1i{Igjl_$TRgY7G(e)%`+GlVykZ9r0ZtYXJpsmT1T z+&%Hf_wq4(*kj=3)xI4w6?iqmcrxUFDtT0*Ow&n|N`ib}cCy9@AjGhb3R!JQ072IOuZDFeg&(M%N`x?M z&CC7!51S0zOx0l)Go9{u&V&T#mR@!04O!RST!RI5PbJs5LIH7N-hFnzmZp{**)GNV z^o;Fzs`G1u)XJr7u{t{QPTSn0Q87`PRg>Z~WNQ3!qj`_d&e`p}(&6Kj8SXRfXK9k1 z_210V*q_&Hni*&UAoX1iynhb1nT};A$?t4Gk~a9xNiphNi|hDTmF}w+MX432 z1bEV_ZdQEcmV`^gIAqU$SdUNo$G#-Jhz!W}VkEHzJB%IpE z=&(hc_Q6Bf0eIImc~v)PdmPw2VP`i#ElC$;D%;Q72JLYwI3d`D@0{(oQBw znKo`T;)oa*SQ|E3%SLf2fa&L>Lz!P9=N}p(`uf+&{lD-T&O9uZkVckjn(+^Z(_k}X zSYTtHz)xR7Yu-X$4~4-BYf?R;l==76|e^u@D_ zET8dO!(sTPWcCbEZ&4^!?iOZ9|FJ_kA;C*Xc=p z%?APE8lBE7ZQ_{_dOd01f2i~UP`5p-XdU`_)t(Lo(inZ*^+?%{E0$T72Sd)^y5ECL z^};o@GrKc=p00(C(2MGKQNHD8miH{^3@*DmTSIPQ={e-3bLi4JcP)94H3?Z#A{%;So%1{> z*|a!e36$n`b~_n-)#_Yl=9+w@?cwokMV)V#_@tXNVm&$5xyGTB`-K;*CTEb?`=Dz& zUf5NP8e$d?E8y{F){}jGw&uSx?sube-WZtnZU2}ayoU%34xE?2FZ{E9d&75NiU|ub zmOdOhPUo1rRdW*)FU|=;c|yA#l+I(fckB2^-&Q!KqwrqCxLL#%^ufN;PE`nJ4I4y- zpP&R>EBQ+Ea~arO~AxF36oq+!W(z7SQB_jrLlyim#Yh$Fz;|z|xyX zku(bDa*u~*jtLQ4H@~yS(9FhhZ*QYxD5_HPDnGqBV&*HQS!+Dg!YyiP-RCq`P&1YF8d* z&*`Q%h1Ua%mmJ@<#~SQP%aS?VwcHj2@v&t7IoLP8IT2+*k4@BfV#+&gGJtp+x`_aD zj#2*5RBD)9#nMuz-aPzD_>^9n z$dXAVWjE_nGCSEO(!c*r&4~bU=PgHNxfG{m?FI;?_*5`{=O^^jy9^L{4V}jAta?DJ z*y#AsS%##T|3z`RPA4bBo2VvM?Zc~pZPPkP`9toj?`En^0vPK53KuZEL#iqMP7Uoj z)FGwrv$hB%IOAhTD zR6a(2{7iY)L{*khMR1mTh22Js=bQX}%lIG#r6*f7+j)xx6{V}PHp1G$_J*71Mm9t- zkcQr=asj6qa7Y^a-sIgcB?u|8Us;q@4Wz_2e^iH-v({xhBaC%bxrp&!{`K!42<4{X zWxffA*yNQy524gFt1A{>1F$e3FgDdDU8R+?xuZ*rJIc_(ZV7h z`w|U5TDCZE`xP`aqSmyxa{28s54VuESex z56!H(NbCHV-}$9aL}r^-n>p1~Ex5C-Bdcw!3vyxETVMr>fq!mL(>Fgy2T-3>9M1j@ zY~Ps*;pTfZT|U_AL*VH%?@27?jTO0^+|)=)+pCcZ9YzrSrpC&i9j>d4NZ4rv%2=^v zT1Fotf5^Y7qVK>%m~`9*oxFQ(BC4&LjI_P7mZ*ZYI3qQ{g|S(dP4nlmV3_KMe_qvz z`=1sx=AD(1Y1~QsauxsexD^SgZSm4D|0L>f7STBT<&bf@;O7v_EPeb~NS%F#T0-C+ z$Vu3J8rKAWHLI_6j&<>2&;TUbqt2bKtH~zNDIPyjvzaOB1{oiD<=GATg93#w4D#A* zESzKzW!9r-dXbiZkmlhtQ3tGeypp5Cg*}pj!ymJ2B^}#r29TFJqp^zk96sBV3#k0{ z@D6dhi5Z_W4te}M1tGPwQMYgvz7xB&yP&^;3J49us$I~bBVR0iVX1V$=Ni2#A>iWR zi_$^=M+cS6hC3UUy5xFAA4Accv7e;nBjoa8F;3nM^tys+n29p7d4%pwEsr5p^}{%& zCzMSUx-}hYxzy(wz#@gKNe-{kSVQqQbW81qOL^Y79f~UoqaFCI1BTesF1&9Oqw4sz z850>kc{J%0eQ0C8A&7}(72&+gs5yCIS(B;*dPnP^orctSpG{P+A6O&PLvuiSQTq7k zq!MC70;2f&f$buuST5v?LY9$RdeL*E4U?yf5iC4DN$p0*JuCv&h94Wn0VX}Uh;{D`CZQ8(#@lcw+Z=SZusuBxA~UOi)y<`3;Pq;apw zhVcebjgdVbUZpz_Hf^3zG^)}D1gS4iq0)-R+=rLa445;;M_zfym%K-nMorsHv-=6= zG*ieIzY7y=+Ljj>;?^ZQzgDL+5BRG|a9Kr;Y@9k)owhSo(-8HQv5EmrF2C~j)0t%F zzOxoDYH0vHzPmA1(a@cs-v`xn5*zO)z?&N+@&_oFdfk{>^#r2cYln1cm|3*GDLH*R zj3L|Q^2?$2lcCPW_uM=N3v_&;*^{)cqw-< z44Df^ikT1@r}H^IG3UPuD2$rKgjS@smk8zGov>p*hWH&FebJ8=Z1SXKQKHc75uO(U z>k02(+#Pg0eLKPpN>61I2K85s{d8$6K=hqp$0z<>D2o~-5_cltMe zbS!Q4eZAA@d@Dz!P7hKz6DvE`1T%ER;9C!s#wCV{ww^EJ=hb&g?jN;7;+DTuOQY@! zFF%Ryv}O;&?oYcW>-*D3s6H*sQy0Y z#T#m?zLR49b&cJ>WO)+pl&tQC6%1vw?#{5)kdtJZJo#tF0iIyYjXeV|b)ubcCygmk z1M2nN*pyK7L2cUi7obP&KQuBeZ#kBdKM2Nkf0oD@a<%t<*1qgf6B!?+ACwTt#<-&*p zZzqD_Xnp&=ezU6BvvPvl#xfRzt-!sWe%jqJl^Uo1Bbw$izBm4Ht$O)|%53}#Hy|04 zz_kn=_^(>$7vE=p+~8PQnW4{h=-rzxiH1^e+m$LTMqYBaEzGmG~^19FiVAJd6{F5AoHwvMk^oFqP2*j>2IW_;%XOB)t@J zMM{JRSe_*cBl{UFV_fg{uqva5(1;5Zmim|)G8E%vCopIBG!tM8}J1- z3UZ>Ldu47BmheRqiejiU-wL=G(mCb?_$Iu`1K}g|%&@Y?!Wd-zoE_RO^|$h2=eW!h zdRqSYjF1>$8tk5)?7twNm^Z*}Z;#HTt;~i=bG9ZU}x|=dt#+7e#)N z(wd9+#OtuP+(_awp`yb?cQ*FHSLDp1gNo~hm{q~U)1Tno7ty%EtDZXLgQ@&&w3C7j zQh{^$h~f76luRPQI` zT{gh}E{n^y#0hejku~EwHxwU7Als^^y)&C6|3NNsk3HPj{41>7CBM`4xXyG)If#4S`R zj~j>A7ZOU4tgKVchSRVY{?6Q-ZU=PviD0}HRcE3i(G2OMH!$pW=JWdEy}-70wiESc z@c<$xRv9-sCTs{Hcs@eR`w>QpR1brdmBp5XybBbVmM_ukLKIt>IUM)tj;^;auOY zu>j%hBhM~2JYJ-pYpf_`eD=mlHg@v}!6lJIGtuSPcZoBtUQLyaj617Mc0VKV^_hCb zk-_-}0n?#zg!OBJfH=5(p5>Bsx}Uo9CfBBJ?sv@2#H9xD zQ4lkg=JgTq-rdh$SZEWaHuoHd6UE zId+&EJMpsjPKFlzIV&&X47DqOl0^i$wsixb^V-4s3ejId5f>sa2%)B$BNu?87402S`hxmS2-_?e{0QK_3b%h@Y z*b_18+0)Lotfq6u#^Eo1<-_4PwLrH9fNjgv4tE>tuEYw|#r7ZXWo50wlBd6Jy}#&= z2&oiQ#0MIQs2AYmHfkC?+scS$L}wT!pd0NBMib)P8+aWUOKlU|I7w{L-$I)+Hm749 z`+~Rwf0>(W!>ZkMtc_i(eZs(>Zc5@_l10u(f}g-xg6;i~)fxGxiX`P)u5U>kYcLgh z?2%2vJl0tnBb99u;qDXkvMvq!rs!ecKM5F~#cQSga45q2rO7UjE?B>=&aQSx>XqJH zUH|OitcO#)&>J35PU0pdDY)`OVjhP%P|=L;QQ`D)K#uRHm79yT@;n7NNs_IfQpB3j8vi*5Y+vP;N z7@{cfr`U>lg0#8|$;TQ)GAZ1(-Vp&F&FIwo#y@mIJOo0hn%#ol z8nJRUS;&sbWKh2-cbnc~)JH?Lq1S)i#VYu!7sL!5a~H1A{b?37Zu6qKwo1Cq(3nI0 zA4)>=;EI2X-8jc*a9>0Ld^`6wUzxx>SuM+AV0Inu!Y2LPJ{jXhH|1Q5<7mYDrSjFuP+02uI96^w^SX}=f`cbHb1wBIib@$h-s1jJ?X8^9zzgFXr=HKWx4=!1E9lxw*6pU+yolstG21cE9fEIIN zz{S>%m;!`Pdk)nMt#IqvoQ!GW@^-TOGF!ip`SjCQz}-&kY=Nb(<0ZN|p^O&ur*MV9 zK3r+{U~YN7$wY`d=hxVtW%C`4)F?Xil8EC<1uP!lPbN+|F+AofryDmN$o>d1dK^ZF6DkUr^ziLhHEPjsX>i4fk$Xym#zE?RN_GoszP zlG07bhuh=P`~LCP-QItENK5QF7g4XdA{ftZkIekYNc@r_l)Srq2)uW8WvvK42J{Z@e z#aK0xzvyM3k0xKs9Ac7|6I$dB^Il|^J^_aRYrqW#%vshbD;$=2JJ@vN>_zt*DOp4c z)`q_%js@cpak_n;FSwxCc|Jbqvp>H#)mGuv{h{~E?h73yb2wuU*1H07XUs%(>IgJjOu(f>YMF4*iJ^06Aqn3h>jv-5;=a%%>Zg%gRgppxsVP^@D-s+I>o z204bk-YPuaNe>7<)cXFJ$VUC$o1&Ec9Q>i5e2t{EQnm$-I(sH&Ij`4Nc|1%6NM0Za z8eGFpm#%A4^l6U5$gSU$vhaH@rea&%`ch0{zcy?lNekW=LzObY=<&#b{5NH>8t@lG zgT$KnP`kk}QGMwd`q7)sO;&^WH{ci{d|4ceAm0R6{Ji(g+;olBvf{^iQL1!!&2Xum z7=DEh`=x8@n3ew!E3%SZ7*w8+ybi?P$sg0d;2-JNrUAz2BVT%{ovYn6VTJ)KDe9eAf t`t$&6`+o=tZi0Y;r&g}7x7Ycn3tN06LWXw<|9!4dme-K0mH8O*e*l~*&bR;o diff --git a/config/alarms.json b/config/alarms.json new file mode 100644 index 0000000..21738fa --- /dev/null +++ b/config/alarms.json @@ -0,0 +1,18 @@ +{ + "temperature": { + "min": 20, + "max": 30 + }, + "ph": { + "min": 6.8, + "max": 7.5 + }, + "do": { + "min": 4.0, + "max": 12.0 + }, + "ec": { + "min": 500, + "max": 2500 + } +} diff --git a/config/sensors.json b/config/sensors.json new file mode 100644 index 0000000..731c7a9 --- /dev/null +++ b/config/sensors.json @@ -0,0 +1,25 @@ +{ + "rtd": + { + "address":"0x66", + "enabled":true + }, + + "ph": + { + "address":"0x63", + "enabled":true + }, + + "do": + { + "address":"0x61", + "enabled":true + }, + + "ec": + { + "address":"0x64", + "enabled":true + } +} diff --git a/data/EZODO.csv b/data/EZODO.csv new file mode 100644 index 0000000..e69de29 diff --git a/data/EZODO.json b/data/EZODO.json new file mode 100644 index 0000000..a966f1a --- /dev/null +++ b/data/EZODO.json @@ -0,0 +1,3 @@ +{ + "do": 8.45 +} \ No newline at end of file diff --git a/data/EZOEC.csv b/data/EZOEC.csv new file mode 100644 index 0000000..e69de29 diff --git a/data/EZOEC.json b/data/EZOEC.json new file mode 100644 index 0000000..0ba3f05 --- /dev/null +++ b/data/EZOEC.json @@ -0,0 +1,3 @@ +{ + "ec": 1234 +} \ No newline at end of file diff --git a/data/EZOPH.csv b/data/EZOPH.csv new file mode 100644 index 0000000..e69de29 diff --git a/data/EZOPH.json b/data/EZOPH.json new file mode 100644 index 0000000..5dc746d --- /dev/null +++ b/data/EZOPH.json @@ -0,0 +1,3 @@ +{ + "ph": 7.12 +} \ No newline at end of file diff --git a/data/EZORTD.json b/data/EZORTD.json index 7e8d79d..901404e 100644 --- a/data/EZORTD.json +++ b/data/EZORTD.json @@ -1 +1 @@ -{ "temperature": 25.488 } +{ "temperature": 29.500 } diff --git a/data/HTU21D.json b/data/HTU21D.json deleted file mode 100644 index 45644cb..0000000 --- a/data/HTU21D.json +++ /dev/null @@ -1 +0,0 @@ -{ "temperature": 24.60, "humidity": 52.68 } \ No newline at end of file diff --git a/frontend/dashboard.css b/frontend/dashboard.css new file mode 100644 index 0000000..ea0119e --- /dev/null +++ b/frontend/dashboard.css @@ -0,0 +1,505 @@ +:root { + --bg: #f3f6f4; + --panel: #ffffff; + --panel-soft: #eef5f1; + --text: #17211c; + --muted: #66736c; + --border: #d7e1dc; + --accent: #097969; + --accent-strong: #075f53; + --ok: #168a4a; + --warning: #b97300; + --critical: #b42318; + --offline: #b42318; + --offline-neutral: #7d8790; + --shadow: 0 18px 45px rgba(22, 40, 32, 0.10); +} + +* { + box-sizing: border-box; +} + +body { + margin: 0; + min-height: 100vh; + background: var(--bg); + color: var(--text); + font-family: Arial, Helvetica, sans-serif; +} + +.dashboard-shell { + width: min(1180px, calc(100% - 32px)); + margin: 0 auto; + padding: 28px 0; +} + +.dashboard-header { + display: flex; + align-items: flex-end; + justify-content: space-between; + gap: 18px; + margin-bottom: 22px; +} + +.eyebrow { + margin: 0 0 8px; + color: var(--accent-strong); + font-size: 0.78rem; + font-weight: 700; + letter-spacing: 0; + text-transform: uppercase; +} + +h1, +h2, +p { + margin-top: 0; +} + +h1 { + margin-bottom: 0; + font-size: clamp(2rem, 5vw, 3.4rem); + line-height: 1.02; +} + +.header-status { + display: inline-flex; + align-items: center; + gap: 10px; + min-height: 42px; + padding: 0 14px; + border: 1px solid var(--border); + border-radius: 8px; + background: var(--panel); + color: var(--accent-strong); + font-size: 0.85rem; + font-weight: 800; + white-space: nowrap; + box-shadow: 0 8px 20px rgba(22, 40, 32, 0.06); +} + +.pulse-dot { + width: 10px; + height: 10px; + border-radius: 50%; + background: var(--warning); +} + +.pulse-dot.online { + background: var(--ok); +} + +.pulse-dot.offline { + background: var(--offline-neutral); +} + +.pulse-dot.warning { + background: var(--warning); +} + +.pulse-dot.critical { + background: var(--critical); +} + +.metrics-grid { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 16px; +} + +.metric-card, +.system-panel, +.trends-panel { + border: 1px solid var(--border); + border-radius: 8px; + background: var(--panel); + box-shadow: var(--shadow); +} + +.metric-card { + min-height: 210px; + padding: 20px; + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.metric-card.offline { + border-color: rgba(125, 135, 144, 0.45); +} + +.metric-card.normal { + border-color: rgba(22, 138, 74, 0.45); +} + +.metric-card.warning { + border-color: rgba(185, 115, 0, 0.5); +} + +.metric-card.critical { + border-color: rgba(180, 35, 24, 0.55); +} + +.metric-topline { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +.metric-label { + color: var(--muted); + font-size: 0.92rem; + font-weight: 700; +} + +.metric-state { + min-width: 74px; + padding: 5px 8px; + border-radius: 8px; + background: var(--panel-soft); + color: var(--warning); + font-size: 0.72rem; + font-weight: 800; + text-align: center; +} + +.metric-state.online { + color: var(--ok); +} + +.metric-state.normal { + color: var(--ok); +} + +.metric-state.warning { + color: var(--warning); +} + +.metric-state.critical { + color: var(--critical); +} + +.metric-state.offline { + color: var(--offline-neutral); +} + +.metric-reading { + display: flex; + align-items: baseline; + gap: 8px; + margin: 26px 0 18px; + min-width: 0; +} + +.metric-reading span:first-child { + overflow-wrap: anywhere; +} + +.metric-reading span:first-child { + font-size: clamp(2.35rem, 6vw, 4.3rem); + font-weight: 800; + line-height: 0.95; +} + +.metric-unit { + color: var(--muted); + font-size: 1rem; + font-weight: 700; +} + +.metric-source { + margin: 0; + color: var(--muted); + font-size: 0.82rem; +} + +.system-panel, +.alarm-panel, +.trends-panel { + margin-top: 18px; + padding: 20px; +} + +.alarm-panel { + border: 1px solid var(--border); + border-radius: 8px; + background: var(--panel); + box-shadow: var(--shadow); +} + +.panel-heading { + display: flex; + align-items: baseline; + justify-content: space-between; + gap: 16px; + padding-bottom: 16px; + border-bottom: 1px solid var(--border); +} + +.panel-heading h2 { + margin-bottom: 0; + font-size: 1.2rem; +} + +.panel-heading p { + margin-bottom: 0; + color: var(--muted); + font-size: 0.92rem; +} + +.status-grid { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 12px; + margin-top: 16px; +} + +.status-item { + min-height: 78px; + padding: 14px; + border: 1px solid var(--border); + border-radius: 8px; + background: #fbfdfc; +} + +.status-label { + display: block; + margin-bottom: 8px; + color: var(--muted); + font-size: 0.78rem; + font-weight: 700; +} + +.status-item strong { + font-size: 1.02rem; +} + +.sensor-health { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 10px; + padding: 0; + margin: 16px 0 0; + list-style: none; +} + +.sensor-health li { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + padding: 12px; + border-radius: 8px; + background: var(--panel-soft); + color: var(--muted); + font-size: 0.84rem; + font-weight: 700; +} + +.sensor-health .online { + color: var(--ok); +} + +.sensor-health .offline { + color: var(--offline-neutral); +} + +.sensor-health .warning { + color: var(--warning); +} + +.sensor-health .critical { + color: var(--critical); +} + +.alarm-list { + display: grid; + gap: 10px; + padding: 0; + margin: 16px 0 0; + list-style: none; +} + +.alarm-list li { + display: flex; + align-items: center; + justify-content: space-between; + gap: 14px; + padding: 12px 14px; + border-radius: 8px; + background: var(--panel-soft); + color: var(--muted); + font-size: 0.9rem; + font-weight: 700; +} + +.alarm-list li.warning { + border-left: 4px solid var(--warning); +} + +.alarm-list li.critical { + border-left: 4px solid var(--critical); +} + +.alarm-list li.offline { + border-left: 4px solid var(--offline-neutral); +} + +.alarm-empty { + justify-content: center; + text-align: center; +} + +.risk-normal { + color: var(--ok); +} + +.risk-warning { + color: var(--warning); +} + +.risk-critical { + color: var(--critical); +} + +.risk-offline { + color: var(--offline-neutral); +} + +.charts-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 16px; + margin-top: 16px; +} + +.chart-card { + min-width: 0; + padding: 16px; + border: 1px solid var(--border); + border-radius: 8px; + background: #fbfdfc; +} + +.chart-heading { + display: flex; + align-items: baseline; + justify-content: space-between; + gap: 12px; + margin-bottom: 12px; +} + +.chart-heading h3 { + margin: 0; + font-size: 1rem; +} + +.chart-heading span { + color: var(--muted); + font-size: 0.78rem; + font-weight: 700; + white-space: nowrap; +} + +.chart-frame { + position: relative; + min-height: 260px; +} + +.chart-frame canvas { + width: 100%; + min-height: 260px; +} + +.chart-empty { + position: absolute; + inset: 0; + display: none; + align-items: center; + justify-content: center; + margin: 0; + border: 1px dashed var(--border); + border-radius: 8px; + background: var(--panel-soft); + color: var(--muted); + font-size: 0.95rem; + font-weight: 700; + text-align: center; +} + +.chart-frame.empty canvas { + display: none; +} + +.chart-frame.empty .chart-empty { + display: flex; +} + +@media (max-width: 980px) { + .metrics-grid, + .status-grid, + .sensor-health { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media (max-width: 640px) { + .dashboard-shell { + width: min(100% - 24px, 1180px); + padding: 18px 0; + } + + .dashboard-header, + .panel-heading { + align-items: flex-start; + flex-direction: column; + } + + .header-status { + width: 100%; + justify-content: center; + } + + .metrics-grid, + .status-grid, + .sensor-health, + .charts-grid { + grid-template-columns: 1fr; + } + + .metric-card { + min-height: 178px; + } + + .chart-heading { + align-items: flex-start; + flex-direction: column; + } + + .chart-heading span { + white-space: normal; + } +} + +.chart-filters { + display: flex; + gap: 10px; + margin: 18px 0; + flex-wrap: wrap; +} + +.chart-filter { + padding: 8px 14px; + border: 1px solid var(--border); + border-radius: 8px; + background: var(--panel); + cursor: pointer; + font-weight: 700; +} + +.chart-filter.active { + background: var(--accent); + color: white; + border-color: var(--accent); +} \ No newline at end of file diff --git a/frontend/dashboard.js b/frontend/dashboard.js new file mode 100644 index 0000000..5f1c9e7 --- /dev/null +++ b/frontend/dashboard.js @@ -0,0 +1,610 @@ +const POLLING_INTERVAL_MS = 1000; +const HISTORY_POLLING_INTERVAL_MS = 10000; +const ALARM_CONFIG_FILE = "../config/alarms.json"; +const WARNING_MARGIN_RATIO = 0.1; + +const sensors = [ + { + id: "temperature", + name: "Temperature", + file: "../data/EZORTD.json", + key: "temperature", + decimals: 3, + valueElement: "temperature-value", + stateElement: "temperature-state", + cardElement: "card-temperature" + }, + { + id: "ph", + name: "pH", + file: "../data/EZOPH.json", + key: "ph", + decimals: 2, + valueElement: "ph-value", + stateElement: "ph-state", + cardElement: "card-ph" + }, + { + id: "do", + name: "Dissolved Oxygen", + file: "../data/EZODO.json", + key: "do", + decimals: 2, + valueElement: "do-value", + stateElement: "do-state", + cardElement: "card-do" + }, + { + id: "ec", + name: "Conductivity", + file: "../data/EZOEC.json", + key: "ec", + decimals: 0, + valueElement: "ec-value", + stateElement: "ec-state", + cardElement: "card-ec" + } +]; + +const historicalCharts = [ + { + id: "temperature", + title: "Temperature vs Time", + file: "../logs/temperature.csv", + valueKey: "temperature", + unit: "degC", + canvasElement: "temperature-chart", + emptyElement: "temperature-chart-empty", + color: "#097969" + }, + { + id: "ph-history", + title: "pH vs Time", + file: "../logs/ph.csv", + valueKey: "ph", + unit: "pH", + canvasElement: "ph-chart", + emptyElement: "ph-chart-empty", + color: "#4f46e5" + }, + { + id: "do-history", + title: "Dissolved Oxygen vs Time", + file: "../logs/do.csv", + valueKey: "do", + unit: "mg/L", + canvasElement: "do-chart", + emptyElement: "do-chart-empty", + color: "#0f766e" + }, + { + id: "ec-history", + title: "Conductivity vs Time", + file: "../logs/ec.csv", + valueKey: "ec", + unit: "uS/cm", + canvasElement: "ec-chart", + emptyElement: "ec-chart-empty", + color: "#b97300" + } +]; + +const chartInstances = new Map(); + +async function readSensor(sensor) { + try { + const response = await fetch(`${sensor.file}?t=${Date.now()}`, { + cache: "no-store" + }); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}`); + } + + const data = await response.json(); + const rawValue = Number(data[sensor.key]); + + if (!Number.isFinite(rawValue)) { + throw new Error(`Invalid value for ${sensor.key}`); + } + + return { + ...sensor, + online: true, + numericValue: rawValue, + value: rawValue.toFixed(sensor.decimals) + }; + } catch (error) { + console.warn(`${sensor.name} offline:`, error); + + return { + ...sensor, + online: false, + numericValue: null, + value: "OFFLINE" + }; + } +} + +function setSensorState(result) { + const valueElement = document.getElementById(result.valueElement); + const stateElement = document.getElementById(result.stateElement); + const cardElement = document.getElementById(result.cardElement); + const state = result.alarmState || (result.online ? "NORMAL" : "OFFLINE"); + const stateClass = state.toLowerCase(); + + valueElement.textContent = result.value; + stateElement.textContent = state; + ["online", "normal", "warning", "critical", "offline"].forEach((className) => { + stateElement.classList.toggle(className, className === stateClass); + cardElement.classList.toggle(className, className === stateClass); + }); +} + +function renderSystemStatus(results) { + const activeSensors = results.filter((result) => result.online).length; + const offlineSensors = results.length - activeSensors; + const criticalSensors = results.filter((result) => result.alarmState === "CRITICAL").length; + const warningSensors = results.filter((result) => result.alarmState === "WARNING").length; + const allNormal = results.every((result) => result.alarmState === "NORMAL"); + const anyOnline = activeSensors > 0; + const overallDot = document.getElementById("overall-dot"); + const overallStatus = document.getElementById("overall-status"); + const healthList = document.getElementById("sensor-health"); + + document.getElementById("active-count").textContent = + `${activeSensors} / ${results.length}`; + document.getElementById("offline-count").textContent = String(offlineSensors); + document.getElementById("last-update").textContent = + new Date().toLocaleString(); + + overallDot.classList.toggle("online", allNormal); + overallDot.classList.toggle("warning", warningSensors > 0 && criticalSensors === 0); + overallDot.classList.toggle("critical", criticalSensors > 0); + overallDot.classList.toggle("offline", !anyOnline); + + if (criticalSensors > 0) { + overallStatus.textContent = "CRITICAL ALARM"; + } else if (warningSensors > 0) { + overallStatus.textContent = "WARNING ACTIVE"; + } else if (allNormal) { + overallStatus.textContent = "ALL SYSTEMS NORMAL"; + } else if (anyOnline) { + overallStatus.textContent = "PARTIAL DATA"; + } else { + overallStatus.textContent = "SYSTEM OFFLINE"; + } + + healthList.innerHTML = results + .map((result) => { + const statusText = result.alarmState || (result.online ? "NORMAL" : "OFFLINE"); + const statusClass = statusText.toLowerCase(); + + return ` +
  • + ${result.name} + ${statusText} +
  • + `; + }) + .join(""); +} + +async function updateDashboard() { + const [results, alarmConfig] = await Promise.all([ + Promise.all(sensors.map(readSensor)), + readAlarmConfig() + ]); + const evaluatedResults = results.map((result) => + evaluateSensorAlarm(result, alarmConfig.thresholds) + ); + + evaluatedResults.forEach(setSensorState); + renderSystemStatus(evaluatedResults); + renderAlarmSummary(evaluatedResults, alarmConfig); +} + +async function readAlarmConfig() { + try { + const response = await fetch(`${ALARM_CONFIG_FILE}?t=${Date.now()}`, { + cache: "no-store" + }); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}`); + } + + const thresholds = await response.json(); + + return { + loaded: true, + thresholds + }; + } catch (error) { + console.warn("Alarm configuration unavailable:", error); + + return { + loaded: false, + thresholds: {} + }; + } +} + +function evaluateSensorAlarm(sensorResult, thresholds) { + if (!sensorResult.online) { + return { + ...sensorResult, + alarmState: "OFFLINE", + alarmMessage: "Sensor data unavailable" + }; + } + + const limits = thresholds[sensorResult.id]; + + if (!isValidThreshold(limits)) { + return { + ...sensorResult, + alarmState: "WARNING", + alarmMessage: "Alarm limits unavailable" + }; + } + + if (sensorResult.numericValue < limits.min || sensorResult.numericValue > limits.max) { + return { + ...sensorResult, + alarmState: "CRITICAL", + alarmMessage: buildAlarmMessage(sensorResult, limits, "outside") + }; + } + + if (isNearThreshold(sensorResult.numericValue, limits)) { + return { + ...sensorResult, + alarmState: "WARNING", + alarmMessage: buildAlarmMessage(sensorResult, limits, "near") + }; + } + + return { + ...sensorResult, + alarmState: "NORMAL", + alarmMessage: "Within configured range" + }; +} + +function isValidThreshold(limits) { + return Boolean(limits) && + Number.isFinite(Number(limits.min)) && + Number.isFinite(Number(limits.max)) && + Number(limits.min) < Number(limits.max); +} + +function isNearThreshold(value, limits) { + const min = Number(limits.min); + const max = Number(limits.max); + const warningMargin = (max - min) * WARNING_MARGIN_RATIO; + + return value <= min + warningMargin || value >= max - warningMargin; +} + +function buildAlarmMessage(sensorResult, limits, alarmType) { + const direction = sensorResult.numericValue < limits.min ? "below" : "above"; + const range = `${limits.min} - ${limits.max}`; + + if (alarmType === "outside") { + return `${sensorResult.value} is ${direction} configured range (${range})`; + } + + return `${sensorResult.value} is near configured range (${range})`; +} + +function getAlarmEvents(results) { + return results + .filter((result) => result.alarmState !== "NORMAL") + .map((result) => ({ + sensorId: result.id, + sensorName: result.name, + severity: result.alarmState, + value: result.value, + message: result.alarmMessage, + createdAt: new Date().toISOString() + })); +} + +function getOverallRiskLevel(results) { + if (results.some((result) => result.alarmState === "CRITICAL")) { + return "CRITICAL"; + } + + if (results.some((result) => result.alarmState === "WARNING")) { + return "WARNING"; + } + + if (results.some((result) => result.alarmState === "OFFLINE")) { + return "OFFLINE"; + } + + return "NORMAL"; +} + +function renderAlarmSummary(results, alarmConfig) { + const criticalCount = results.filter((result) => result.alarmState === "CRITICAL").length; + const warningCount = results.filter((result) => result.alarmState === "WARNING").length; + const offlineCount = results.filter((result) => result.alarmState === "OFFLINE").length; + const overallRisk = getOverallRiskLevel(results); + const alarmEvents = getAlarmEvents(results); + const riskElement = document.getElementById("overall-risk"); + const alarmList = document.getElementById("alarm-list"); + + document.getElementById("critical-count").textContent = String(criticalCount); + document.getElementById("warning-count").textContent = String(warningCount); + document.getElementById("alarm-offline-count").textContent = String(offlineCount); + document.getElementById("alarm-config-status").textContent = + alarmConfig.loaded ? "loaded" : "unavailable"; + + riskElement.textContent = overallRisk; + ["risk-normal", "risk-warning", "risk-critical", "risk-offline"].forEach((className) => { + riskElement.classList.remove(className); + }); + riskElement.classList.add(`risk-${overallRisk.toLowerCase()}`); + + if (alarmEvents.length === 0) { + alarmList.innerHTML = '
  • No active alarms
  • '; + return; + } + + alarmList.innerHTML = alarmEvents + .map((event) => ` +
  • + ${event.sensorName} + ${event.severity}: ${event.message} +
  • + `) + .join(""); +} + +async function readHistoricalData(chartConfig) { + try { + const response = await fetch(`${chartConfig.file}?t=${Date.now()}`, { + cache: "no-store" + }); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}`); + } + + const csvText = await response.text(); + return parseHistoricalCsv(csvText, chartConfig.valueKey); + } catch (error) { + console.warn(`${chartConfig.title} unavailable:`, error); + return []; + } +} + +function parseHistoricalCsv(csvText, valueKey) { + const lines = csvText + .split(/\r?\n/) + .map((line) => line.trim()) + .filter(Boolean); + + if (lines.length === 0) { + return []; + } + + const firstRow = splitCsvLine(lines[0]); + const lowerFirstRow = firstRow.map((cell) => cell.toLowerCase()); + const hasNamedHeader = lowerFirstRow.some((cell) => + ["timestamp", "time", "date", valueKey, "value", "reading"].some((candidate) => + cell.includes(candidate) + ) + ); + const hasHeader = hasNamedHeader || !Number.isFinite(Number(firstRow[1])); + const header = hasHeader ? firstRow.map((cell) => cell.toLowerCase()) : []; + const rows = hasHeader ? lines.slice(1) : lines; + const timestampIndex = getCsvColumnIndex(header, ["timestamp", "time", "date"], 0); + const valueIndex = getCsvColumnIndex(header, [valueKey, "value", "reading"], 1); + + return rows + .map((line) => splitCsvLine(line)) + .map((columns) => { + const rawValue = Number(columns[valueIndex]); + + if (!Number.isFinite(rawValue)) { + return null; + } + + return { + label: formatTimestamp(columns[timestampIndex]), + value: rawValue + }; + }) + .filter(Boolean); +} + +function splitCsvLine(line) { + return line + .split(",") + .map((cell) => cell.trim().replace(/^"|"$/g, "")); +} + +function getCsvColumnIndex(header, candidates, fallbackIndex) { + if (header.length === 0) { + return fallbackIndex; + } + + const index = header.findIndex((columnName) => + candidates.some((candidate) => columnName.includes(candidate)) + ); + + return index >= 0 ? index : fallbackIndex; +} + +function formatTimestamp(rawTimestamp) { + if (!rawTimestamp) { + return ""; + } + + const numericTimestamp = Number(rawTimestamp); + + if (Number.isFinite(numericTimestamp)) { + if (numericTimestamp > 1000000000000) { + return new Date(numericTimestamp).toLocaleTimeString(); + } + + if (numericTimestamp > 1000000000) { + return new Date(numericTimestamp * 1000).toLocaleTimeString(); + } + } + + const parsedDate = new Date(rawTimestamp); + + if (!Number.isNaN(parsedDate.getTime())) { + return parsedDate.toLocaleTimeString(); + } + + return rawTimestamp; +} + +function setChartAvailability(chartConfig, hasData) { + const emptyElement = document.getElementById(chartConfig.emptyElement); + const frameElement = emptyElement.closest(".chart-frame"); + + frameElement.classList.toggle("empty", !hasData); +} + +function buildChartDataset(chartConfig, points) { + return { + labels: points.map((point) => point.label), + datasets: [ + { + label: `${chartConfig.title} (${chartConfig.unit})`, + data: points.map((point) => point.value), + borderColor: chartConfig.color, + backgroundColor: `${chartConfig.color}1f`, + borderWidth: 2, + pointRadius: 2, + pointHoverRadius: 4, + tension: 0.32, + fill: true + } + ] + }; +} + +function getChartOptions(chartConfig) { + return { + responsive: true, + maintainAspectRatio: false, + animation: false, + plugins: { + legend: { + display: false + }, + tooltip: { + callbacks: { + label(context) { + return `${context.parsed.y} ${chartConfig.unit}`; + } + } + } + }, + scales: { + x: { + ticks: { + maxRotation: 0, + autoSkip: true, + maxTicksLimit: 6 + }, + grid: { + display: false + } + }, + y: { + beginAtZero: false, + ticks: { + callback(value) { + return `${value}`; + } + } + } + } + }; +} + +function renderHistoricalChart(chartConfig, points) { + const chartLibraryReady = typeof Chart !== "undefined"; + const hasData = points.length > 0 && chartLibraryReady; + const existingChart = chartInstances.get(chartConfig.id); + + setChartAvailability(chartConfig, hasData); + + if (!hasData) { + return; + } + + const chartData = buildChartDataset(chartConfig, points); + + if (existingChart) { + existingChart.data = chartData; + existingChart.update("none"); + return; + } + + const canvas = document.getElementById(chartConfig.canvasElement); + const chart = new Chart(canvas, { + type: "line", + data: chartData, + options: getChartOptions(chartConfig) + }); + + chartInstances.set(chartConfig.id, chart); +} + +async function updateHistoricalTrends() { + const chartData = await Promise.all( + historicalCharts.map(async (chartConfig) => ({ + chartConfig, + points: await readHistoricalData(chartConfig) + })) + ); + + chartData.forEach(({ chartConfig, points }) => { + renderHistoricalChart(chartConfig, points); + }); +} + +updateDashboard(); +setInterval(updateDashboard, POLLING_INTERVAL_MS); + +updateHistoricalTrends(); +setInterval(updateHistoricalTrends, HISTORY_POLLING_INTERVAL_MS); + +const chartCards = { + temperature: document.getElementById("chart-card-temperature"), + ph: document.getElementById("chart-card-ph"), + do: document.getElementById("chart-card-do"), + ec: document.getElementById("chart-card-ec") +}; + +document.querySelectorAll(".chart-filter").forEach((button) => { + button.addEventListener("click", () => { + const selected = button.dataset.chart; + + document.querySelectorAll(".chart-filter").forEach((btn) => { + btn.classList.remove("active"); + }); + + button.classList.add("active"); + + if (selected === "all") { + Object.values(chartCards).forEach((card) => { + card.style.display = ""; + }); + return; + } + + Object.entries(chartCards).forEach(([key, card]) => { + card.style.display = key === selected ? "" : "none"; + }); + }); +}); \ No newline at end of file diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..1559640 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,198 @@ + + + + + + + Photobioreactor Dashboard + + + + +
    +
    +
    +

    Atlas Scientific Monitoring

    +

    Photobioreactor Dashboard

    +
    +
    + + INITIALIZING +
    +
    + +
    +
    +
    + Temperature + WAITING +
    +
    + -- + °C +
    +

    EZO-RTD · data/EZORTD.json

    +
    + +
    +
    + pH + WAITING +
    +
    + -- + pH +
    +

    EZO-pH · data/EZOPH.json

    +
    + +
    +
    + Dissolved Oxygen + WAITING +
    +
    + -- + mg/L +
    +

    EZO-DO · data/EZODO.json

    +
    + +
    +
    + Conductivity + WAITING +
    +
    + -- + µS/cm +
    +

    EZO-EC · data/EZOEC.json

    +
    +
    + +
    +
    +

    System Status

    +

    Last update: --

    +
    + +
    +
    + Polling interval + 1 second +
    +
    + Data source + Static JSON files +
    +
    + Active sensors + 0 / 4 +
    +
    + Offline sensors + 0 +
    +
    + +
      +
      + +
      +
      +

      Alarm Summary

      +

      Thresholds: loading

      +
      + +
      +
      + Active Critical Alarms + 0 +
      +
      + Active Warnings + 0 +
      +
      + Offline Sensors + 0 +
      +
      + Overall Risk Level + NORMAL +
      +
      + +
        +
      • No active alarms
      • +
      +
      + + +
      + + + + + + \ No newline at end of file diff --git a/logs/do.csv b/logs/do.csv new file mode 100644 index 0000000..8eed04a --- /dev/null +++ b/logs/do.csv @@ -0,0 +1,11 @@ +timestamp,do +1717027200,8.1 +1717027260,8.2 +1717027320,8.3 +1717027380,8.2 +1717027440,8.4 +1717027500,8.5 +1717027560,8.4 +1717027620,8.6 +1717027680,8.5 +1717027740,8.7 diff --git a/logs/ec.csv b/logs/ec.csv new file mode 100644 index 0000000..91fde01 --- /dev/null +++ b/logs/ec.csv @@ -0,0 +1,11 @@ +timestamp,ec +1717027200,1200 +1717027260,1210 +1717027320,1225 +1717027380,1230 +1717027440,1240 +1717027500,1235 +1717027560,1245 +1717027620,1250 +1717027680,1248 +1717027740,1260 diff --git a/logs/ph.csv b/logs/ph.csv new file mode 100644 index 0000000..2cffd97 --- /dev/null +++ b/logs/ph.csv @@ -0,0 +1,11 @@ +timestamp,ph +1717027200,7.10 +1717027260,7.11 +1717027320,7.09 +1717027380,7.12 +1717027440,7.08 +1717027500,7.13 +1717027560,7.10 +1717027620,7.14 +1717027680,7.12 +1717027740,7.11 diff --git a/logs/temperature.csv b/logs/temperature.csv new file mode 100644 index 0000000..3280798 --- /dev/null +++ b/logs/temperature.csv @@ -0,0 +1,11 @@ +timestamp,temperature +1717027200,24.4 +1717027260,24.5 +1717027320,24.6 +1717027380,24.7 +1717027440,24.8 +1717027500,24.9 +1717027560,25.0 +1717027620,25.1 +1717027680,25.2 +1717027740,25.3 diff --git a/sensors/EZODO/Makefile b/sensors/EZODO/Makefile new file mode 100644 index 0000000..04100d8 --- /dev/null +++ b/sensors/EZODO/Makefile @@ -0,0 +1,15 @@ +CC=gcc +CFLAGS=-I. + +OBJ=main.o sensor.o + +TARGET=sensor + +%.o: %.c + $(CC) -c -o $@ $< $(CFLAGS) + +$(TARGET): $(OBJ) + $(CC) -o $@ $^ $(CFLAGS) + +clean: + rm -f *.o $(TARGET) \ No newline at end of file diff --git a/sensors/EZODO/ezodo.c b/sensors/EZODO/ezodo.c new file mode 100644 index 0000000..fd20b04 --- /dev/null +++ b/sensors/EZODO/ezodo.c @@ -0,0 +1,35 @@ +#include +#include +#include +#include +#include +#include + +#include "ezodo.h" + +int getDO(int fd,double *oxygen) +{ + if(ioctl(fd,I2C_SLAVE,EZODO_I2C_ADDR)<0) + { + return -1; + } + + char cmd[]="R"; + + write(fd,cmd,strlen(cmd)); + + usleep(1000000); + + unsigned char response[32]; + + read(fd,response,sizeof(response)); + + if(response[0]!=0x01) + { + return -1; + } + + *oxygen = atof((char*)&response[1]); + + return 0; +} \ No newline at end of file diff --git a/sensors/EZODO/ezodo.h b/sensors/EZODO/ezodo.h new file mode 100644 index 0000000..b3ba210 --- /dev/null +++ b/sensors/EZODO/ezodo.h @@ -0,0 +1,8 @@ +#ifndef EZODO_H +#define EZODO_H + +#define EZODO_I2C_ADDR 0x61 + +int getDO(int fd,double *oxygen); + +#endif \ No newline at end of file diff --git a/sensors/EZODO/main.c b/sensors/EZODO/main.c new file mode 100644 index 0000000..e69de29 diff --git a/sensors/EZOEC/Makefile b/sensors/EZOEC/Makefile new file mode 100644 index 0000000..04100d8 --- /dev/null +++ b/sensors/EZOEC/Makefile @@ -0,0 +1,15 @@ +CC=gcc +CFLAGS=-I. + +OBJ=main.o sensor.o + +TARGET=sensor + +%.o: %.c + $(CC) -c -o $@ $< $(CFLAGS) + +$(TARGET): $(OBJ) + $(CC) -o $@ $^ $(CFLAGS) + +clean: + rm -f *.o $(TARGET) \ No newline at end of file diff --git a/sensors/EZOEC/ezoec.c b/sensors/EZOEC/ezoec.c new file mode 100644 index 0000000..2fc5d16 --- /dev/null +++ b/sensors/EZOEC/ezoec.c @@ -0,0 +1,35 @@ +#include +#include +#include +#include +#include +#include + +#include "ezoec.h" + +int getEC(int fd,double *ec) +{ + if(ioctl(fd,I2C_SLAVE,EZOEC_I2C_ADDR)<0) + { + return -1; + } + + char cmd[]="R"; + + write(fd,cmd,strlen(cmd)); + + usleep(1000000); + + unsigned char response[32]; + + read(fd,response,sizeof(response)); + + if(response[0]!=0x01) + { + return -1; + } + + *ec = atof((char*)&response[1]); + + return 0; +} \ No newline at end of file diff --git a/sensors/EZOEC/ezoec.h b/sensors/EZOEC/ezoec.h new file mode 100644 index 0000000..f285ad0 --- /dev/null +++ b/sensors/EZOEC/ezoec.h @@ -0,0 +1,8 @@ +#ifndef EZOEC_H +#define EZOEC_H + +#define EZOEC_I2C_ADDR 0x64 + +int getEC(int fd,double *ec); + +#endif \ No newline at end of file diff --git a/sensors/EZOEC/main.c b/sensors/EZOEC/main.c new file mode 100644 index 0000000..0601e40 --- /dev/null +++ b/sensors/EZOEC/main.c @@ -0,0 +1,17 @@ +#include +#include + +#include "ezoec.h" + +int main() +{ + int fd = open("/dev/i2c-1",O_RDWR); + + double ec; + + getEC(fd,&ec); + + printf("{ \"ec\": %.3f }\n",ec); + + return 0; +} \ No newline at end of file diff --git a/sensors/EZOPH/Makefile b/sensors/EZOPH/Makefile new file mode 100644 index 0000000..04100d8 --- /dev/null +++ b/sensors/EZOPH/Makefile @@ -0,0 +1,15 @@ +CC=gcc +CFLAGS=-I. + +OBJ=main.o sensor.o + +TARGET=sensor + +%.o: %.c + $(CC) -c -o $@ $< $(CFLAGS) + +$(TARGET): $(OBJ) + $(CC) -o $@ $^ $(CFLAGS) + +clean: + rm -f *.o $(TARGET) \ No newline at end of file diff --git a/sensors/EZOPH/ezoph.c b/sensors/EZOPH/ezoph.c new file mode 100644 index 0000000..7b9c0b8 --- /dev/null +++ b/sensors/EZOPH/ezoph.c @@ -0,0 +1,40 @@ +#include +#include +#include +#include +#include +#include + +#include "ezoph.h" + +int getPH(int fd, double *ph) +{ + if(ioctl(fd, I2C_SLAVE, EZOPH_I2C_ADDR) < 0) + { + perror("ioctl"); + return -1; + } + + char cmd[] = "R"; + + write(fd, cmd, strlen(cmd)); + + usleep(1000000); + + unsigned char response[32]; + + if(read(fd,response,sizeof(response)) < 0) + { + perror("read"); + return -1; + } + + if(response[0] != 0x01) + { + return -1; + } + + *ph = atof((char*)&response[1]); + + return 0; +} \ No newline at end of file diff --git a/sensors/EZOPH/ezoph.h b/sensors/EZOPH/ezoph.h new file mode 100644 index 0000000..d4b8ac6 --- /dev/null +++ b/sensors/EZOPH/ezoph.h @@ -0,0 +1,8 @@ +#ifndef EZOPH_H +#define EZOPH_H + +#define EZOPH_I2C_ADDR 0x63 + +int getPH(int fd, double *ph); + +#endif \ No newline at end of file diff --git a/sensors/EZOPH/main.c b/sensors/EZOPH/main.c new file mode 100644 index 0000000..f67aa55 --- /dev/null +++ b/sensors/EZOPH/main.c @@ -0,0 +1,28 @@ +#include +#include +#include +#include + +#include "ezoph.h" + +int main() +{ + int fd = open("/dev/i2c-1",O_RDWR); + + if(fd < 0) + { + fprintf(stderr,"%s\n",strerror(errno)); + return -1; + } + + double ph; + + if(getPH(fd,&ph) < 0) + { + return -1; + } + + printf("{ \"ph\": %.3f }\n",ph); + + return 0; +} \ No newline at end of file diff --git a/sensors/EZORTD/ezortd_daemon.c b/sensors/EZORTD/ezortd_daemon.c index 1bcb98e..f009835 100644 --- a/sensors/EZORTD/ezortd_daemon.c +++ b/sensors/EZORTD/ezortd_daemon.c @@ -35,22 +35,29 @@ int main() fclose(f); } - } - FILE *log = fopen( - "/home/cristian/airquality/basic-ui-dashboard/logs/temp.csv", - "a"); + FILE *log = fopen( + "/home/cristian/airquality/basic-ui-dashboard/logs/temperature.csv", + "a+"); - if (log) - { - time_t now = time(NULL); + if (log) + { + time_t now = time(NULL); + + fseek(log, 0, SEEK_END); - fprintf(log, - "%ld,%.3f\n", - now, - temperature); + if (ftell(log) == 0) + { + fprintf(log, "timestamp,value\n"); + } - fclose(log); + fprintf(log, + "%ld,%.3f\n", + now, + temperature); + + fclose(log); + } } sleep(1); diff --git a/sensors/HTU21D/.htu21d.c.swp b/sensors/HTU21D/.htu21d.c.swp deleted file mode 100644 index f5a189b84d87d9f466db93b7f2ef70dc2afd738f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2&2Jk;7>B1EkPH+GR4O-K+>0G-uf495s)R~~q$CoNP~t>LRkYfVu{~nFYi4Gf znnEvp^xku&p12_-IC2DWMB;)}i8K5UNJ#LTwHv!2gj1Xr<~18jf|JaGo>#^B||$LAx@M zTIae}y&9@iCS-HcGE8Wo^D)_xq(ojiH_NJ()K}}1u-mZ&E5SXry!3I-MejJ!_ zRG7d$9Jpqb=J5wX656mfNE$SI^)}er-`U=1P`BYG=Q86_sLP3V579!Jv>1;&H-*Y9 z4W-?hue9dcE-J~3D3x@qpe{U*-jS9bIJtyf_=hel$5?0xf6^Jdu-dxVbJo^+tu_B~ z5ZB+_d9TrJJhHX^V!{6swq2za8wod*xvBxNcm}m5q(vdVO9Pvr3tjM7fAvS2{E(ve>FT z!y3-3EKZ9=Qg!~m_ozxJl<}1Eql`wVQ>kfyqF)-iZfv6R*66b5&CbOlWgQm0vc}8X zdpmCxhT?oY4zt9N$|$69j_NWN9idLtM>tJK;gklsCQN@RDOFiO93~ t4@>`ebbhvJKGG~rvB(ruAP36uIe39SSu7SEZcbXpQeBs`uZl&S_#1Djw^9HA diff --git a/sensors/HTU21D/.htu21d.h.swp b/sensors/HTU21D/.htu21d.h.swp deleted file mode 100644 index 1e647aee920097214d953cc8a7b548bd3a023540..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI&KTaD#6bA4I1sw^36e)+e0Ti?LI#D8^L3q)+uoQs}DI%d+&)6QxJ2v}AK*I^R z1_z*lJAjlMz!m6d!yDOFBqJG#5`80m@~+>T=hf-0RPrMe0K2fm~{UQ21 zN2GLQq;-YqD~dX?OirgaarJyS(CeMFydOnrlHzeLdnP+8=EjR;YFh3h)i&)XsTVey ze!1#(v)nJM_3o?F(EtGmOc$7^ieD}jzATHS#pd)@R3QKX2tWV=5P$##AOL}PCy)(h z=pR4TEN6)`GYY?8K>z{}fB*y_009U<00Izz00bcLP6VVPI{ZL%!*Rd=yYB!VKN3A~ z?m2%sSDZ`E1t;PB<{WYkI9r@ePK7hedEz;DoZHdNYd04Q0uX=z1Rwwb2tWV=5P$## zAn-PUg0{-Eh3ARk-^7nXB4abr(OH(S!c{^XH8~jWKrQ62p@$vS8{h%RAr@O&q zC2ZDfRjvfzCo7Gh{>v3A?t^yvaV)J$C!1>i&e3+Yy2p**O0JRL5Zg*6I!#}kBBX+8 LTRz$NSRp+FZzq+d diff --git a/sensors/HTU21D/.main.c.swp b/sensors/HTU21D/.main.c.swp deleted file mode 100644 index 62204f9e0db425f4f71fc459e61cb047c9e258ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2PiqrF6u_q!aY_cM1TZ>?YdMK6HD%gnZ?#w2Go7uR3YNcsC zD;~w8eg{GE6L?Vk0$#m%5yXR6eVb&Hjik-RQ+)$J65hO-dGnh&C1aOw-&lc5C6i%0 z!PtYt#d^EO*y%~exUi+Al8*hGZP%Mtu(f{@_U?8kG`vTSaj|I0p!hJhJQ+PM#?r8@ zP&&z%P^i!kLSuPt-K;DbO-rhhGj?uDAOmDzoPjBJ-mH{ov}rhXa(!Gf^^*ZIKnBPF z86X2>fDDiUGH}2QM6C(-8~1bwIfqR2zz=F+g&T*0i*cnl=ZW5@B?8=`=MhQ&N9W zAsLnF7_t5~WD771xS5E_4gyQ@z8LToL=6F<69}OOLI<`}>tahrda;sOGVO7DMTZd= zL4Y-0uU1#9bI_C4ecTMqjx?!l#>RVSxc!H0(Ap>+*q>?sR_|Ar z?o>0=gsOMWgPh7`JZ*!EO+%VaF~{+Cnwb$!!wMkH-Z0De=Git&)=M6^>v_gzq;kBN u3(y)-Y*u)wp=E*#uA?Ha)L0zkE#Nk#s{bA1p0tN!9SOrByq?leLVo}O%WVw+ diff --git a/sensors/HTU21D/HTU21D b/sensors/HTU21D/HTU21D deleted file mode 100755 index 01e26dd19ff2ef4309e30a6f9d2ea338bc387b85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71296 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 diff --git a/sensors/HTU21D/Makefile b/sensors/HTU21D/Makefile deleted file mode 100644 index 858846b..0000000 --- a/sensors/HTU21D/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -CC=gcc -CFLAGS=-I. -DEPS = -OBJ = main.o htu21d.o -EXTRA_LIBS=-li2c - -%.o: %.c $(DEPS) - $(CC) -c -o $@ $< $(CFLAGS) - -HTU21D: $(OBJ) - $(CC) -o $@ $^ $(CFLAGS) $(EXTRA_LIBS) - -.PHONY: clean - -clean: - rm -f HTU21D $(OBJ) diff --git a/sensors/HTU21D/Readme.md b/sensors/HTU21D/Readme.md deleted file mode 100644 index cd00d0a..0000000 --- a/sensors/HTU21D/Readme.md +++ /dev/null @@ -1,180 +0,0 @@ -# Introduction -This repository guides you to implement and use the HTU21D temperature and humidity sensor by using I2C communication. The repository contains the following files: - -- `htu21d.h` library header files -- `htu21d.c` implemenation methods file -- `main.c` an example file to test I2C communication using the library `htu21d` -- `example` output file precompiled in a raspberry pi zero that returns temperature and humidity - -# Setup the raspberry - -## Enable I2C on the Raspberry Pi: -- Run sudo raspi-config. -- Navigate to Interfacing Options → I2C and enable it. -- Reboot the Pi. - -## Install I2C Tools and Development Libraries: - -``` -sudo apt-get update -sudo apt-get install i2c-tools libi2c-dev -``` -## Check if the sensor is detected: - -``` -sudo i2cdetect -y 1 -``` -This command should show an address for the HTU21D, typically 0x40. -``` - 0 1 2 3 4 5 6 7 8 9 a b c d e f -00: -- -- -- -- -- -- -- -- -10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -70: -- -- -- -- -- -- -- -- -``` - -# My own header files for HTU21D sensor -This is a detailed guide to configure and create your own files to comunicate with each sensor used by the air-quality sensor. - -## Header -Create the Header File `htu21d.h` with Header Guard and Includes: - -```c -#ifndef HTU21D_H -#define HTU21D_H - -// I2C Address -#define HTU21D_I2C_ADDR 0x40 -// Commands -#define HTU21D_TEMP 0xE3 -#define HTU21D_HUMID 0xE5 -#define HTU21D_RESET 0xFE - - -// Function declarations: - -// Temp -int getTemperature(int fd, double *temperature); -// Humidity -int getHumidity(int fd, double *humidity); - -#endif // HTU21D_H -``` - -## Implement the Sensor Communication `htu21d.c` - -```c -#include //to send commands to and receive from I2C device -#include //setting up and controlling the I2C device settings -#include //definitions for system calls and structures specific to I2C -#include //SMBus commands in a more standardized way for I2C -#include //perror - -#include "htu21d.h" // my own header file - -// Reset function: -int reset(int fd) -{ - if(0 > ioctl(fd, I2C_SLAVE, HTU21D_I2C_ADDR)) - { - perror("Failed to open the bus"); - return -1; - } - i2c_smbus_write_byte(fd, HTU21D_RESET); - return 0; -} - -// Get temperature: -int getTemperature(int fd, double *temperature) -{ - reset(fd); - char buf[3]; - __s32 res = i2c_smbus_read_i2c_block_data(fd, HTU21D_TEMP,3,buf); - if(res<0) - { - perror("Failed to read from the device"); - return -1; - } - *temperature = -46.85 + 175.72 * (buf[0]*256 + buf[1]) / 65536.0; - return 0; -} - - -// Get humidity: -int getHumidity(int fd, double *humidity) -{ - reset(fd); - char buf[3]; - __s32 res = i2c_smbus_read_i2c_block_data(fd, HTU21D_HUMID, 3, buf); - if(res<0) - { - perror("Failed to read from the device"); - return -1; - } - *humidity = -6 + 125 * (buf[0]*256 + buf[1]) / 65536.0; - return 0; -} -``` - - -### Using the library - -```c -#include -#include -#include -#include -#include - -#include "htu21d.h" - -int main() -{ - char filename[20]; - snprintf(filename, 19, "/dev/i2c-%d", 1); - int fd = open(filename, O_RDWR); - if (0 > fd) - { - fprintf(stderr, "ERROR: Unable to access HTU21D sensor module: %s\n", strerror (errno)); - exit(-1); - } - // Retrieve temperature and humidity - double temperature = 0; - double humidity = 0; - if ( (0 > getHumidity(fd, &humidity)) || (0 > getTemperature(fd, &temperature)) ) - { - fprintf(stderr, "ERROR: HTU21D sensor module not found\n"); - exit(-1); - } - - // Print temperature and humidity on the screen - printf("HTU21D Sensor Module\n"); - printf("%5.2fC\n", temperature); - printf("%5.2f%%rh\n", humidity); - - return 0; -} -``` - -# Compiling and testing -Then to properly compile whitout a make file: -```sh -gcc -o example main.c htu21d.c -li2c -``` -or -```sh -gcc -o example main.c htu21d.c -I. -li2c -``` - -### Wiring htu21d to Rasp-zero -Htu -> Rasp-Zero -VIN -> GPIO 1 -GND -> GPIO 9 or (6) -SCL -> GPIO 5 -SDA -> GPIO 3 - -![Raspberry Pi Zero GPIO layout](rpiz.png) diff --git a/sensors/HTU21D/htu21d.c b/sensors/HTU21D/htu21d.c deleted file mode 100644 index 6b88115..0000000 --- a/sensors/HTU21D/htu21d.c +++ /dev/null @@ -1,52 +0,0 @@ -#include //to send commands to and receive from I2C device -#include //setting up and controlling the I2C device settings -#include //definitions for system calls and structures specific to I2C -#include //SMBus commands in a more standardized way for I2C -#include //perror - -#include "htu21d.h" // my own header file - -// Reset function: -int reset(int fd) -{ - if(0 > ioctl(fd, I2C_SLAVE, HTU21D_I2C_ADDR)) - { - perror("Failed to open the bus"); - return -1; - } - i2c_smbus_write_byte(fd, HTU21D_RESET); - return 0; -} - -// Get temperature: -int getTemperature(int fd, double *temperature) -{ - reset(fd); - char buf[3]; - __s32 res = i2c_smbus_read_i2c_block_data(fd, HTU21D_TEMP,3,buf); - if(res<0) - { - perror("Failed to read from the device"); - return -1; - } - *temperature = -46.85 + 175.72 * (buf[0]*256 + buf[1]) / 65536.0; - return 0; -} - - -// Get humidity: -int getHumidity(int fd, double *humidity) -{ - reset(fd); - char buf[3]; - __s32 res = i2c_smbus_read_i2c_block_data(fd, HTU21D_HUMID, 3, buf); - if(res<0) - { - perror("Failed to read from the device"); - return -1; - } - *humidity = -6 + 125 * (buf[0]*256 + buf[1]) / 65536.0; - return 0; -} - - diff --git a/sensors/HTU21D/htu21d.h b/sensors/HTU21D/htu21d.h deleted file mode 100644 index 444c464..0000000 --- a/sensors/HTU21D/htu21d.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef HTU21D_H -#define HTU21D_H - -// I2C Address -#define HTU21D_I2C_ADDR 0x40 -// Commands -#define HTU21D_TEMP 0xE3 -#define HTU21D_HUMID 0xE5 -#define HTU21D_RESET 0xFE - - -// Function declarations: - -// Temp -int getTemperature(int fd, double *temperature); -// Humidity -int getHumidity(int fd, double *humidity); - -#endif // HTU21D_H diff --git a/sensors/HTU21D/htu21d.o b/sensors/HTU21D/htu21d.o deleted file mode 100644 index 14a097e042ba38f16ffb8d3e7858a74d4de6d743..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2720 zcmb`IJ!}+L5P;{rHZhzr#{9_Ap}mc;A|i$5Y*Cm1(mEuV0wHubA_dZA@Aes=xbvF5 zXJTUnrlZ7CiZoc3T!f^e151DqX`(1d2%%6x4yB^%|R&&YQ2dDZ@JpUd?$Yk?Swy7o?yw*zgq7C+oM>d>Z zSjnNT`2LG_GwZ#?ysf0ZpZ<4!!*5Yvk5OL+>s#D3S9C5wF0PYn`xk4=_f+iP_g_k_ z>#$#~iNKMe6HbZ=M~(}pJkfl{RwAauRG`#b`R|Pm{q`fW67K^Li@Cx$#vyn2a-PK$7vkycCNKASjA^g zyUC>aAyQBl=`q}0xVCPgV~pn=L|+j{`HmhuAMiY(wS>-UJN&hhHgBb#WB?2Q(!|0{ zX<`AMSVK0%_M3cT%+tOgT37psIA4;d6Sf-p$+Vy|g%V%)2B*ICYWt1*fNVSdRL}Gv z>PZ^kxdx~HQGS(o5p9wY{H5g)$jSdtazcswO3JvL8XO4R3iJoiKMj#+2np4&B5N=y zq9}}@I#?++>Uerf-$Yd@O63_T;IxpVqK+QEoQj0zL&v&AA>~?FIa3OJ>67!3sd_c2 z${AXcq%RpDhpkC^lz@KbTafGB+{JvG!9UUR#D|-0Pve_drye6z-{vaae; zb>qbui>gO)^`D`(Jw!o+xKEb{Ag{NIZ>n1x=2`Nez4NUrdE zN-VkyUzZ%3#JtxrykN(lIiBtzQq_&q$NnENH*ZW8$8N6%qa2{`g>t@Y`~b#MPQBM? zf?EFw8Jej26~ce`aeP4m9(y>UV{lc!8b8B%rR%N*vml-{eNS?{>8|3Z^`xkq^%s$) z_3s8B2(^FeAH}M8)jz7oTpJNwXQ -#include -#include -#include -#include - -#include "htu21d.h" - -int main() -{ - char filename[20]; - snprintf(filename, 19, "/dev/i2c-%d", 1); - int fd = open(filename, O_RDWR); - if (0 > fd) - { - fprintf(stderr, "ERROR: Unable to access HTU21D sensor module: %s\n", strerror (errno)); - exit(-1); - } - - // Retrieve temperature and humidity - double temperature = 0; - double humidity = 0; - if ( (0 > getHumidity(fd, &humidity)) || (0 > getTemperature(fd, &temperature)) ) - { - fprintf(stderr, "ERROR: HTU21D sensor module not found\n"); - exit(-1); - } - - // Print temperature and humidity on the screen - printf("{ "); - printf("\"temperature\": %5.2f, ", temperature); - printf("\"humidity\": %5.2f ", humidity); - printf("}"); - //printf("HTU21D Sensor Module\n"); - //printf("%5.2fC\n", temperature); - //printf("%5.2f%%rh\n", humidity); - - return 0; -} diff --git a/sensors/HTU21D/main.o b/sensors/HTU21D/main.o deleted file mode 100644 index 220d15513176ab7556a264ec407e373c444ac0ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3024 zcmbuBO>7%g5P-*77u+WOp=n7aqjsC7D2Qg8L?GIn+$3!ygh*v2q7nypV?Seqz3c9- z!665HMjT?%D+s9^fD;EK6mh9QNCrrCic^6 z8>8Ji0L`Q1+f74fcMLl1+tB(AZVW#5-X3?!X z1q|LW!-VlbRcp$#gSw~2vC#9@Z1EiW#!K~Txlj()1tPn;urOy%E~>S%?U*yqS+myk z)Xc?a*bM6(2^A#X&O)+rGLarR1(*sam`~E?xpe5-2M0dfKmUGe=*q9Z{CJ3cgA|1) z;ji66K4aic1TgS#kQi8LkQlJ94~N^ipAUB7d zG--{FYWLe+M`WXT$(o0e;qOy1{B#VTjNun!_oI&GhTn|gP_@gB zm4}G}OfF+Kgc$zX^rdWWs&&{7=M^; zQcG-Ki12I7slL8%u50`Wwn^P!Tl$xr@GS)({R^*fJk_Tcu}HuMaoV#Y@3BE#){4-_ z8b8i9sn6Mt-tQO8qxbtAbLn5!Vl;SZQo z{V}#l{mHh}Y4G@O)>23KKg^?bl315S>THHXNHLc>!bg}#>m1Yg39dnk-YX>g(2w8n zo>=~RHL%yf!h;j)l31Rq*jAt#0ayh)u)$jMeXu+?9OT_)&tNXq-1F>kEc4$+TNmkH7<~^Ye_8J!xb!c2 z9{pnLq0dGeVrMk=70!=_Pcyin7ezbTe-_!G=XZny==Kl*~cnov^ diff --git a/sensors/HTU21D/rpiz.png b/sensors/HTU21D/rpiz.png deleted file mode 100644 index 05c09da3af3abba8347f1a35c10f238f9ad08d00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108576 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