From 57cadbbbf0f6ef8f5ace86b07620329121d66680 Mon Sep 17 00:00:00 2001 From: caliskanbi Date: Thu, 20 Apr 2023 03:21:08 +0200 Subject: [PATCH] BackEnd files changed --- documentation/ER Model Gran Canaria.pdf | Bin 0 -> 20665 bytes software/backend/backend_database.db | Bin 16384 -> 16384 bytes software/backend/data_handling_functions.py | 91 ++++++++---------- .../dev_test_examples/mqtt_publisher.py | 2 +- software/backend/main.py | 51 +++++++--- software/backend/plantdatabase.py | 9 +- 6 files changed, 82 insertions(+), 71 deletions(-) create mode 100644 documentation/ER Model Gran Canaria.pdf diff --git a/documentation/ER Model Gran Canaria.pdf b/documentation/ER Model Gran Canaria.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6b30d94acb4326c69d356335b6de19124ea9e083 GIT binary patch literal 20665 zcmd6P1z6PGvp*pqtso-3NQffK!qVLx(p}Qs9ir0GAq~bi$ z@4dhKJokTNpGS9hcFxS4IcGlKIcLs+;*Ee14IL1SLU9Lup|Ao#0L!-~C>$IpwDQhY z`T$x%Cp%#|I~_ZH6k1&!038Y~KQHuuE-n;(3%z?z=HFVp(J_QFztOSLx3B}yL4TG- zp_SCvGuGj=bONY>pad2MIv@)xfRU9ENYA1H6=`W<2W7SeF#f?Ut8Z&*Z=^kpU{z*vwAf20$xh z26dHyzOJR7{=HONI~#o+a}=ip$V_j5yx|k?1!oPxSx@uChB;UM4ju`wp68sXcsNAX zk9hHGZ{=xvc{+F=N~b>%KUb8Vb6ewpk3L#C-5RyI+KE}x**QAd8{Vqu*W%Jlo^Noq zt*=i2VwSq!&0n_*A^y-`=u*Zw4!a3lW*B>4u-9_``fEY zTz72E+UrR!hHsB94%aR=Du!vLv*zDzpO>_APc31(UR#9BZy)4wdK9;7tsh)XESW=U z3LGj%cgv?{6>FwV9MyI#@@CB;@dXa0qZZ{;y^1xHCd_I(26?k)e-I1Hr$!ZPrc9L7 zc1-d#%prLN4v^75h!ZBbYCCW9G|V8M3LJ_@f#p-JiZ%Ddf}k-b(}-3qZ%9+U!ekb= ztN38t@XLiWaTid!-UYgj>GUWBfH~Fb6hoORP zbcBIuo!%5xAPU^_<)#>QzA73d`{(@Imex^fh1sf~^j5Utx=zY0Wy zTfWj%sjeK2dSs)c1w`xd_O1fa;WDi@b*L-HqJnL841s99`WaQP8KWVqB@^n3@!dAI zDwaUhKK<4zD%NPmHU0MW1Xw%^M7?Uf&;tXW)p%GuD@45}ywJynJeu`qu(|zs0~B)a z`aFTLD0YZ;og-hsU&J#}5@9vy?bp%P!*c`-d7>p~*x;-6atH5OL+)7vez2zBv%dPl zx^d4canEZ0gLU|xHTj2B`+KR`P}VWhtzi2$^_t3$>lNUeo@`6{nP^T;my>GkqCQVF z7Wk6yXdPZ)070K;AoR;3T1Oxlu(xmpbFz6aT8tkrdy~n!+Sg(>tQg$jJMlOEL~R(QK~rI9Mhbg%2RW-H!ZT*87=r9B{H9G zwrS2zlRsTj|SCM7b`)D<(ji&c@^-k_K14l@Iny`c_x?;%l>I;Ax*r3g;+xMthG)C8h><$qcMMLe@3hi7b=nxc3V@CrJ#>6OfC1Qjo@OlY z^w9AQ00Y2%p0&Pv@FV~KhVWlajC}qvqOHIx2WzB3OT)`pnR&fRT33#f%|T7hsXSrV z6Qd&Hozb*9molZ0)BjQ8L>`jsiFOh3_UOktm#<2gr<;wMoD+HNE+@)GT*SrDK}1Y| zRrw=$(G7WopkJ&J_1f@4&-UFt|9=O+k^s$of3cTLCG1R#hBtc zKDu$pOvXEr^tmc&mn#D9jAqnTmnlV`ZVqW`Oy!BY+8h6m620rHzbfILZZ>IZOyr@u z+Upbnw@0DGe5L4<&AI>Mv+(Xtvo7IC8g{P#_UzNuUIn)YSDnYz^~%!8#Z3+K+E({Q zc!Lu(6RGn!D@ow4z5dqkbm#JJT~{TfhfLH{vBwQBZFINIRenXk!_{_0zx5S| z$JNYTp+$1N`)Uoz?d=u`JNNgk`}Fe9rvgn z-d*Tl`fMBX_1oep_TAV5a4DlshS5i?vzMc6mTQLW7t%{riOKHHms?j`)wRl5 z`Whx1TeZOMIBpt}1mA|l`d9(A9W=n_jQH+L(1w;00JztWYeRv{|4F@OF zowo%V`H)W#hvG5d*i@@(jj}1O>5f@JVgaNS;!r-;H#Rk?%C2T=_$M&};!rXsH8$0$ z%C2Ji!gNQkATb~EgBUzEHK@w2YAS5HV^ly?07-*5l#Tr$nr1-yRQ0X>n;=b^3X`+R z8X4J=Hv8OYO5No#gQ&hsO)HgFY`~dd)b^#OlS(Tt;7kZA(sC0*l@%XwCKOe8xe2Gr zN(eX;hU&ZAL{ViW2Al~;ZC`F;tg?~<&P1RhtuzT%S;+!tB2k4`niQ(66oE5QsJ<&r z`c+n{z?sje?JG_8RaTn7nP^m`)h6#MtGB?J7*yfarl=|_1K><7s_$w^MwOWfa5}EL zZM6haWo7}Kj_*cXD`~AVvH?yfv?B^+oURuN09B{&v zaUp$?%)DWRF{h^)fHjIR{)oX7FF|bwGo?3`0zW`Gj78+h6kEOyQ`T7~bkEAkcF#I= z&l+*hn)ib>h%k7>2tCVKU~-@q5^=$lDc#GeyO*^ydM~T!UahPBy@h%A zYBlfGo^IZ&{V%fqy@gYG@w=mvXPcR>_QQ468=A9rMHbac%(MSXWc0I5A6NV4y6OeZ zS*s$8N+sr*Jc8X(DA~Z(zO>Fo(;Dg^=om9VJ!l0pv;dRd0xR+fJ`^7bFunlK^WWmQ zzaI`&y`AE*m~r47@9}8t9C$Md?MmM_y3Qrm>i@KbS#{N0nzQyryVXjLvw1bUqZ((M zg|7DF|6641qTNa*$C*6#-BF^m&0tsi_PXjN%~>e9T*+}dZyY-E|ChsOGOq&f|GI^y z-=O&N5*jVvVbYsmMSS5yv5){X7(6C~p6b4sF#p}S^Go=chC$j@bv0|8kOq|uUHY?? z=(nSZlAyV5UA0{ia5hi;?0@y6RS|F|5A|%bsjm7TKThX$Ll@WIp;-Kc1;*G4Miz=Y z&9EZ=@S#tU0E`$sh0REw|6efr7hnAc$Pek5(k-AX(y0Boo(HZo9HGWL?Z&t}t#jd6 zD}v)_BQBg`E7R${P`dp(e=*liTYt5A*=m^V=2Y)d#a%X*L%XCrE!#XbW#>^UM_bgu zT6fmjy>T59o#hry>+%;Wa5Z1x&+VC^02Sh+g7Daq+Y4euO#@yNqYVNU{+{9M$FIsato+f(1Y z)fwwM&ZDJM8u4ji^XY?Ijn%viN!>hx$7}9O#mSXn*3W#bxifEK&U7b3?77R8^sbMU zTpl0MubQOKyPghXCfyv}oG)5)OuN(7*KT=ii)v|k^gu}5xo_)9Xit~Ab(uWg;~p_= zO2_x)~`W_51&n(pu;r*t1cg0EInLpUpDJTg}|EMC|H_7atId2L9_^QNZ0npe=C?zZ&5 zX!wK~p*ogVb;)#gR2Gc6n;wiA<}fL09*r5f7HwN`HoN<^zS6C-Cwf+?Vdjp-L6dR2 z$RT&Wqc3mu(j&*?Tr{LxA7xXy@Ju&3z`BO@?8aT1y`;S=e?EEDU6CYi_40cyw-e!| z`qsq_0mNeMEat4oQln3UyLV4Fe!iIddh*B)_QW*gayYY;Gk?qOtTTRkcty^+UgDs2 zY&!AcEO|_Nm8(8yj#$(4U6XvsP6-d~*{QEgEWCduqb(O%Et^c8q^Yh}j9an}L8 zVY-2{j)-`6TF1jM`GGTPS^N-Fx$BmDO~vgz$=2D$%L7W>DYe_7g^S8^lFu_XxF>4w zycsbXo|*1WPnT*E#FpQDSoE=-VY}U$x1O7Kwx7$Lo#R-a9(;3JG@eyZpk%J*noR3> ztW z_OzzM4$(MmYj>rm*SI4Z6>NXAM*FK8Kn2~B7dN(h`B#;I?taVte(~|!4}Vo0s07&P zLG)k{105?p7|a5uSN+-epLYHA>~*1A?R59LpvxV8=nlJ`CG`8ByZS%A8(UfkKsVw6 zbpN)8|L5xLFFSq~IPMDrD71V!w)#Ix1hgXhW)Avx#=1Hvv~u=u?S2$N?w6a;(ubf0 zbYI`t!Vo~KWNg7}VQc&s;g|I${rw8@uVvOB%hY?h0{XVPHpW&^L;om6Na>hEi!1!9 z_b+M*$jZP7hORehz#uS?o}QkG zkqJNt2GIeT8JSt2>s(f5Rv;@2h=GX}TJI3G(=jvF<+U(0(+7Z1XnAdQ@5?c)AZW>j z8O#8NF8l6Hx~I|5)6oH0=@>vv_v>dJD-nHTLnAu?6ALp`8VfxOwByQu(irJkfM9wM zm<|kej-9@_;=Sm5BcbIFeR=@>zg1KI^fvvkYvG^H_{FpQq5}8r?|*}8|2Yc(j%T3k za?Z9;&7u|tmOlzLvigR`(2W9T02ME^9;N>hg;v@|Pv7Q#l&D1Yp#3wpbA}S-?5(WK z^v&=43;I#+`Nu&4{1`UqY*M@y|1~6j-Gce6 zYR1Y4ojL!aXr>V+Y3T)cFkUo8*_J-3$#F~u;bi2bLi0&~&dYJWhZ;C* zE|w~dxay8)5N>-lVX^{nhJg15-pi{htFMmQc)<#1sKmX0GqWReeU!ue`e4yQjZmuK zGkAm%US#h2U~wDK7l{tj3HwwtpC|A5p>K#Su4DCRjAg3calIF(bnaRPP6E6CpC6iNn?fZUH zWj{YPQL2X&?}e8+1z#>Cc|Km*r5BKYqOdF*Zpi!LZABp!#fxnNc>%$3MZ8YOMhyX> zF;*OzHwLkcS_?Z3MQG*^$!f}CipDN?+p5~ieSBU8MGwYLK2W&!fI-)eZ~Pk+z7NCS zA?TN=yAL;L5^Z@>EA=g|Hwc8eGvKQKIAVD`3rpfJDBkk zUw%QIUyzE0g%t{%AUf!y>=)`Ua>0Mg@RRpH1wenLCHGJLzX0ezQ?=KS;k0Z9Jes}0 zVb0_i*k;;zORBK3m_m{}owKRktV25L2_nAULrsX67yOWQwo5!ibUnjWJ|^(JsIe1+ z%t%+^+awL|b2JwG?p*xHFl*hFNVz>c=~atFGO2=5j5r_I{fZ|^y2?6dUuHa+Ra}u# zJ{FU0bMasPn)h5c8| z{&R{lL80qkKO_rSQ0?Rt$_?kG!>8vZhcfFJ-jk=(BtKD&drI}h#+&JBUii?{@aGKP zaIKi~s*eRSaNeM4=Y2eX_9o^r&ZCv5x$=1F9!NMo!AonsEMf`?Ap!b?C%q*M?pH}} zMuXOMCv!DBRc8rxXOo7>H|$sG#-rxqemrr=;>RcACR-xslR@ThIpLl!IeyijskO1T zyXGustQaXYeu$}qP;d50iFxw*64FB*CgyxqtVY`$udm?f*;)r;-sJ%Ths51XHgEdUwduRXB#c;W$POc)6DMh$y4l2ds@IfwM{Uw0 z9r|*h87{K_w3LV&3Mq1{7kMzHK+6Rp32EB{v&yYyIj{75|1t|ciKxxs9P(xzj2v?2 zN9e%97pxOxJzPFygs`^^@8V`!D;{C1h|lvATcC)NR$$ZbN3m63WAu{U6-g_1r+-WU z_;${bX7?^zxRKz)v5RU_NDt2eOLhz=>Ul7PT&6pvY~~v>YQoHTxUQ^jx}{-KOgrCw z?@C;LDZeCQwUEm!_?0A_`CS~28=PghZ-+;^n;&8G8F1u;ZI$5g5!g3hn@d}*gLBzq zW{Fr?N;Qm&=d{tS9V{g+P4^Zwxo(e+$nuljH;V(3KV0X$7`+q?X?H1KQ*5~b z^sasNa4)I@@@ZX5^BbIv%j~}+>^m^oF*%kb!fPDzWYP8Oa;|bQT}^c9ZiVcyI-JKS zx)9?BZ*!&+>a>y#oDx#?zdt8jZ%Nxts}r6y$dJ@|k|DmKIFZo2+uSo}7-<+&Xjq-B zV}ntJN#~m6Q}}TfDRvS`6%)jYq)5!-toT;)G8mauK3bPB7z88~^-_(|Rcnn3OV78!VyMR$m$wGhc1WozO>_ZR%rE)y}?3mC@ zM;DIZ7)}zLDVvBwv$|~5SgWG3)fQ~asCG>wxRI@)dPFs7ewjlTCuDQsa3VKeMMV44 zgz04bB)dv|g&R*Hwc+yNhfd-u4%@P|d|U%(voYCaH^%a2VwSay6HqU)NH16ck0*a< z&0hiS%MG$}L8@B*^|F@ zAgxBeRNZq!V4{x2*;E4-DKf<4$SQEok7Mk6z8fw#*K6CSrzmR5df;=_9m%%cVUmT% zez~xdqvz95oKw8Ply%8d$sd={*Cqr(+U&q<8zg2ScpRk1f{Y|t5hi4)i_O5q6xK%R z#oWZV&CC=o55w{FCl)}M|1 z6{PeSIP!E5i27|F+9Y?f>Vo)mQX2KGBs(O_3AQ^CYZlNd(k;g!+j#XWz9(+HTKH#< zaqS@Q$LJqxhjfBxsKe~s-^#j#xAwG&T0cLO)`!3G9uaj!<;w)z#nZ1UfL6G9 z)i2X zF0e8X&x?GQA$r;yKO~#jHQTL*^j)|RDnbQ0hij>K&C5k}+mR$}7zYSe#>OX`Lf--HqeEVB)--D5t@^b3p|^x8piS zm}vaA?Bl|pd|c~(+Q0X1px_caDrl#b>{V1Cx$O#av#4x%Oy*-oJdCuL$l?TwS*0>` z!wPiM^j}Ef^YK8Tu$*`UQLs9RZ7pQp-r>_k*byd-VC3iFnVD5Wq#%l3I${*hE;Sx~ zL)62h%B7y}{cqLo&S=9atSu&2cV(;fiH+aM;>Wqvw9sDy=&LIJbn@WuvJ!B7by76xYcoQ&5JZhCM z(i%a{AE!-sh)?N8bL|~4@G$^0#E@zu7U9|ST5T05zC+FY6%AVO_VN z%%F3y&l8I7)y8KeJ`387JnY`7Fef-wHaEI!t*>ur7N!j_KQo`md4K0}P~e@hg!qt6 zg^m21-)(fp_u&xYIngB!zoHEz+|T)+yHz9rgr5U5KXDxITLt?9iJuUk?ho|v!(%EE z3lIY__;yxOf_x`A&<0-4J|QL}#z!v}Q4wq^mt#)frJiU^z9mh*?6i(tvv|!hO2{N8 zWdKoqEssFdzLyjdzLSLcd{nMa8&?u&6{~F4uH}BBaGF_aNXzMV`r3aY@A1wGplTV` zxzN1lS;1H&d9b0%U}WEl+aqu|afnepN59f+Q{dO$TLVHUPi7#KEZA0F?~7hz9ZI6LGo55Ed~8b}Dh zDI?`x*0)e#d>o<0gqOQ`8yt)==deD2$vG2Q&pbfFyfnIQTBgF5 z6ZI+Z!z1CLrJ>%Zy01i6>Tc!TQ=bV-IMv#z@DzU&yd?h0gUM;z^sVmrO+Xc~26sPE za6T{I$4ni3HcE-ci!^nz7>02>s~jI~)b_dW4Ti$Ls{qjJW~p~>J7F(k3@ud?-z^v4 znwz!y7rQwuZ2KVWWL??532{=i(fY1}CybUZQtr^9(d$K7*T5pEQsfA#s85y_zpEMe-}G-f2iy{pMY$ z<;6L}v&;FQr14q;eZLnMC9y4A4`{k=4)_S$DahN5-}5#fzFr7y30e!IE7%Vxdy7=y zf`JDkjc*}!7uy%{A~uU_W4{0U{MhZ0oA{mGYSis)G?(0sfvyp85_mj}A)NPVM+Es> z#&tWm$0hXW3I24kbsiC1yd$x(VVc|#xq9!}QKw42kfP?RfI<;CRR*GPI@jse{Pa#@ zxSsolxGz%)oAmHdnta*kjeIZ|K~=WtTg5S+;{22)soOn&WrX0x?u6a2>e*`IS)s1b zX~PM@Y!SbQ=Fy0NMbpr7HA0FdKZ*OL*hy#NUfl`XXrlf1=O3T8b_@9@gvEqo(FVY^ zXT*g&5nZa+QfaTe>R=0_%e`tWvEfx-JqABp12Qh^CM9NxCHg;B*S306Nm(TUj36T% z>ruY@a93-p+ZZR8rM?^ZHu0F~sL#i;esVy|zK-30OdUSi>$7d+K=iW^N)>IV56F9h zfqZsYU#7HCw<)O|0cF=ouGup$_U&I3oRxP$Vrp3PA^tL}q|rzOm@dQ*F}-oqoblys zJdtQI=>^pZBb%Ce+@E;FP@Xg%mn#GBm=OkX@NQZ}Az#qi5gQ)pKM|qt{5&kc6}(U0 zn%?L)@U>QXsXZGch{Kk?E21-^{dM|b-V2l0%aRO-;utpyfyP z_7?jYTfY>28LRm&fU9%k3-lI?+q^>Onv-JUc)tWzc~%X3KJV8&DM z1@?<7kod-=NWCnP2^$D+XD`sHud)yW3vWDZ`km`_FE|LP4a~M{+&eggj?-A9RH118 z8ohUVC_z&ZLoT^M3xf@mhqHD#^>`YBjj8Fv$q?(VyVOaM<-+BWvCDFj!=r<}@vc?Lmgy`=?$eLka_&>N~p=Bns`*B4L(V|K_y&Lc%;%3(Y zaZ+JvAJl7n2pU|hll|~kwPBiEB+N77d+GyDtXk?u)1f;*57`iMCE<157P_uyDuHX- z_-zC$g5>J~n$(YC$lfQxrJYf2A~ABmLh;dz@k#$Y;iaI&!3`!$;B7)`2fUCo4GK#` z0cp>`6zXv-y`ZQ8__I1oYL1=Xd_qeJC_Hi-g5<9?iKl$)$uv)KJ~%VJ?e4@mCXv8D zv0mJgaGfXUC(Qm*{2t=p_8!vttWu3QwC&Mb+-;^bsjtX=#ZP-kpVsLCD6w(5?zZ9R zMp;vOkS$IyFcn|;Nu3WNuO(Q`AWO6Be8L`M)ycrllr^ixwh%a;e&QaJI?k?Bk8Qx- zxb4OD;&`Z&?!%7ML)!1@4-&BJ?VEgM##qiMUo6W#0jf_3TeH~GCQb^dL<~u(bs;>y*r-Tg_C1;2WF*pg(4}Di zFokDF^;sRa;f=uTQ|fs_84mGPCWbjz2H7^rN$aC(MO1d@{(>uFF8T_c6U5a?;c+Tg zS|z)n(N7lD6jsYSw}d#h=Snxz*|W?#QrB2Vf^0cqS@`zVPS2il_q=5~EF+hcWIz_U z*7}^@!dM2wknRQ6Sw8IwOhw{Vd=Hy>UHN<^^SD2S@#V17Mr=3Z%cHBWMfCB5N)i72 zW2WH|2T5^nu^6pgq{t~b@<&N1fF$KWg^-+u%~!oo#%AH;KC<;qeq|s7r)BFfvb!sM z1>1HHRlZo%++F9EJfSBR560k_hJ;ezJrPBJ9=li<3q5>+!{vzR-1E=?J;KjFT zI6_?QXc)Bz%Cs?lnrvO_=NLObBlU zhR}$5TUbo-FiNve+bfc8*37GnQ16=PtJ?k^_j*^y^NI?j5%x!O-Q-xIS#fBHX;P*m z7~;YNB|-)MlE;@S?v8AB86U$ja5r25L@q<5h%@mR=o?Ds1d<_bd}nWbYY6Fz^Bz?v z384;Wa(F}^j@atLD{MJB*crVyud+T^n9m6-Hqoy?w7TQG-WZr2-u35qmNAn`KO@OX zXxey2$@PAXMKNs<_B|!{E}0vRP;$5b=dN{I1P6Gn&<*+t$r>G%b)3pw(U^(|>dWo# zYwkmR9f>}ugY1$S3GJwG{<;S~aiJYsCf5ZVwH?i>w;oB4od=3Jq+tdQzQR2jlqt~KlJOA;7hCOQ z4Gj%_O};exN)+Jl57(Y4iY!4dx77Y{$vJKFoRH4vomO*N*wZ%WXj<16#^Y!hU7hno zoT}qk`PRH>f*RFb8#R7RZ-YcV;tTu<-G&e4?>JA4j9w);FC!Z$-qF>s)I}4!&kx;E zpXS-q+}ut1oJraU*@kYf;djo6#3MCO@MeY*h8*v;?-_UiCySW2Ed>&yObO2)G`u*U z7h1)V^$QZ#jJK}!muW~2JD7L}v+>ZwQI1%IR*SP?YA-K0KSpjh(f!7L{Ido)@7P3I z^q>b%sdIN@I3QE%Wdeus+eWXMgoC9L;gGJb9;?7IwTvepH6_FXL$K{s(ffJI+R*l)}rObFcSpVP`BKM+C!Xtd=@_T|_g628$( zS9d|kAk2)^jr>x96ZYI5*;kTPZu_e}pM4eP)pP)nN4(AZ)1owY;3o_$Ywe09v{zBD z3JL@c@(VFPKX@Z#6cQ4@5mQBOq0VF+@~Pc|<1}(G*vH`+Cy|jao(6qJB5AdNy~>QS zsCnWd%~{lw_#KD4%54>~@U)oJ4v8+=!5;at$PDwUS8S7SP5XCIEOtgB1Yr&N64MG# z5tEz77H0rzSZH%u&l0+x2^Z6^1|MPVy7`CiPyuBUUX7Qq7Tb3LY5g4=Bg~2=G8#@NbK8-jrPEl9Vrf%)yzfsD<>)G#G4PB zl$sx53$pHvRaPN*+=I3*5*%XeetGRdR+&t6Jowkv9VdUWl`z8%r)z#rIlwKwo! z^g|af`t(jNez{$j-eZi&RU0iQGqO)T!hQ)$$J7!$t#*QRnXhn$30qq-kqC{ZOHj1l zEYKT{vWmS~QZtEK6>Nh3GOn8 zjUqeiWBOimGOB?(pj*2Phb=UyE2~8Y%kR3VFgo--I*!IB8arQxbl9h2vT>o;ibF~9 zAHgQ@MqgK2M`FZ+(|AR#d;C>`mczyoWI&cO(hgNMxbp5)Z6VEnZ$+Er|+DzW3H5he*Ujf7BG zUoWiYc8e=1Tm@4;N)Vc_96&qabqw1aoN&sIoY<5Xt{T=NK|3GSCd)CxzeYkJ93GSi z-k|cM0y1Tp<53J^-JPV%D=tt}1%%7};_i4F-$yiV2# zeoE|cP$&{DJS%xD=`+&3e!NHY?>%`31HF7z&H3D6(qfz-qnh&TG~;p*< zrl+ZoKNOA0qAHqlZ^2KYj^*jujB|mJ*OeNs`e(teMRmlkJCO0)9rwP;GV3E%k&m$7 z8|O;P^9aIMWO7SgMM4*~ve?Y|_u`OmZF6lcx2q{W>scc*cE!=eM?Psl^PGM>UCETO zHjntor*PV8tD4-BG%oXargGym`Cg@OT$g?EmW9MYKYUCwLOKv>f5erff4fXU>$~2k z6wcG{BR@XYgoE~m11WvTCg)dgj61hHcj$@FwrYLFB7&VQpz z@aJ9sXt;pf%uCW+v1Jp&@vY$-nbjIa&bi&9p!M{GgjL`>jQ++?LWq~77=xX>Yx`ir z=WffX2ro{LGmtZ?-Zvz<1~0V{ldr;72Akm4^N-b>3(hO|-3nNyA_+Q$K0hZb{|0b& zX0s+Q##C$sojtYtHvb*D(fE1f!QT7CD=agA<^$TLJM=W6ZBu}I50eM!Mo*dK1d7xG zkx$Bj6825x_|iUe*R5JiP4-9nU=~a^E1iI`RH5|<>&G&&>rrpsABl2BQ*G#wK-O|> zlrd1Po*EkrcEAkAwt!UwS|fF1Ra-V%u0%Bj%BWhe{AkHlV-^)&gSJs+-Hjo9aqw8L4mw!Klh z=u1L%n9QXNxI2&tyPk_hINU(kbGX)lorm4)bBlJxy$Jr6YS;5(-oXSX7hl2SnrhYb zc7~d-VXa*sZfVcUE+Uu?wU`uU)t)T$KvWB1c^MlwAD z!Dxf#XsyG}Db&_ad{d|hf+;e`CiQDiJ3s+-X)G=iudrtpzS=0W6LJ!=zow_RJ8xOA z^=*}rFAGGZ=X}E1vcqY&_((Vj(!;+IOFG@y_i^T-7ES3_+Y}!YYz1P(96=N=rK76= z{zEJ6N&~0St+O6}D2jvg-6d|GbL<`T2lX6C{=>~+D)o4w^^HIxpGa}vsN?O?UiSi*-29+ zPRrJxoY?#`@E=Xygh;k|#h)=Nd zI-1?TP<0NVMer(I>2-skCUG2v^vnLuN5+ocHuY)I!US5)%m;OD+_VnmDPya&=*H$3 z2qO~Kz7|F|Qd@NeZsNl@HsH~j%tcDzP+7e{LF?;+*YZ@f$SYmwq(!wcPj3YM!abE3 zoY>S?`Y@2D*tS>7F))yeLBNpIr7tgn{4}V^UQL^rC6;@{YnLLJNtSC)f7vNBpD`#T zom3%^4vC}u28$cO62MQkV@^R4l(u>>CNw)!%hyiiqC;Q``MgqX?2AFvt>h*AXfI@@ z&J=e<%6z1Iy2-`PBwc1NGq{Znexz8M$ePzY-BNBovzH?0gM0ilSfR`8;qi9)4uJ?t zpUNW3;Y`U;!Xc$0B#L|r1X)yfAJR#X?ke?(@EBZtUkoC8cfDj!$Ftg42x5DBPne96 zPkrYGdcWvm=8F~UYUA#W*p82QdNj=~{v7RDDgv4SncjnM*1}Kw;@7gR+TetS5 zteuG3y&+mV^>N%li>nf?{L5Fu=YAS)gl5v}WN0Wfq41j7V^5g%BqhbgeeEFMV#l9! z+Dw7X6)}q#1SM*zGZ%Z`$jQL%#^FDYD1C;Vk|>AjCYakTTB`8W`Djput|pZOb;sm= zXY5Wc6)xiZMQdADmqcbuGR^vEy+D=1pfxgIh9iSyD)+1{b&-Q z(!!!^{l(c9=b3$5_jCOvSRqG_?-9p}-}ptS)3QRS26lGMp2}d$;93{?-8>f(j1=Uc zUPOKzf`176SgFJYOijSdCyD+kp;etXWoQ;ad{q*@lIn7et;3^?$d&C$0Esge6f`IW z4=Z*ZF}=`IFg~mhlA!d{E9_tHq7SRk?}}BA3yqD6n#1ZWSwjR2Jc(UJ81Gh?koTs3 zskE{}fst)B{2Tbx}t32ytvw7jWk8d33tL$~Xx1MVmN@`tuJw;UpL-PyZh=C-4J?Q^kwL_6H?gCwT62$jDDw)V-iG(vYhm$@mOh6kXXA;b({M4!kFD&;!{Y|r{ z>SHT;39q*Rd-{0{NbXxH@6x86%tNy#_lo(_qlK>?*G~39j=a)ir-?I;T4Lmy_*eFF zx~szoh=>Fa$>>+wF$o}FCYO6pmj|h>G|NS)l6HGL7HkjIp5N^@X8Z0hgmES)>^s?P z*Fq@5&65mPdkp4AIfza+SZvu$hUq{=c%Ya1IPar6og!FB17TKnZN3cPbw7RfWOZ3? z(EwX9z`*JOf!Nz%XGF>n6)7&-4*!EQ>36Efj%)VtYE0_GN0Zp&37jWg?Q(a*s*u7O z*NuQ%r3zr%W_!})$xTy+DnzmB8=lc*xyjjkl9^fDMk!I+ z&428O#GT7wbQOJ`wyCVXWsZ?~zp~#(j>%=vAM2I>IF_Xv@!eo~Ld)KH*!hm*TqkHo zdaLSl{TKD^K*J$qr0CX_zLZaaWAspMnP&-t#l}_sJFQ>sAns&7aCi*4x;WhBbh$Eo1VzpP8fFd6s>fvO-y2}ifi%b z35mmfetarvIZYr=Xe6Oic*s`jP2y2yrgC^8K=P^SBvOgG+<1wj?lfj7UlF@KOB_>_ z1+ZXZoYn#nSEkm<@Zv%)C4WNBLA&6KRSzU3j&`bK^6RLlw2c{LSlOne6`OC*M7A$|x6>nzTTe@N56M!YHeNknC&M`lY{ zYgJ?zkTiaY)Hs>k2umvB6$J))LUU_6tY~zw*cy4U9AD^mIOV|$azX>mVx=YnWO&)2 zmJ{)hL)}9v#_Cw2dJ%e9hpP;I27I%kN~)3wg>g>%C1kTzCWi@H4m~QdZ@%VP%DR@4 zQLhc53elxH22dN4N*&l_VYw_~yuOV!FSK8v9Tc{@w7z)vDA4{N(06JOWp=-RCf29*egz#_(y99L20z9ET{4H<4DJ zFa^k%?Z6lr^@`U~+Fix?4Z5IxhWMcWLoP^4zN8`IU8iMdzoaz{w`~n2?9-It(PI3Z? z(JhKpL!=7SOlhdSADgn-59efEjZQqg#7!MsxNf{4BUGlJC@UM%R;rkr!NM4Gt(_B5 z*}&qID`1v?V^}#NXp5~xTL=#p$x?5=4%r-BmyW|EUo-bq< zJAMn%q^;k9XD)Cn(99h}I>B0n6x-V*wTa6Ov1_JiC@kW7eopha>>Q`ic;DUXiGFGl#W&k0q!IHG1i z+`Np>ByTE?D?8uw`CCwl!lfi~ecQ}Qv(IpN%|Z|6A*)U;)7jbz>K%bMk?2=6ec>4G zjiWyQl*uREXJgWyO<+7-Xyg4C>%vHF4%K9|_ZPBiO~PN^UiXM(EIMbxy&{$E57e;t zqSpcu?`mds%SbaP*4T?pER8}Q?pO(+7X^VPWPAepozScV(DKWC38qKdKCdiPQ>4~8{^rH# zoq|i<2swGl-uA9Hr{lZ)IB21_Mfp%}{QH4WZKteaSD31(qy*XP*E#6euc|XebV%LC z7@s}=EY1vHhov~4`xqiT2w4TG5r~I`t;o{{CS;xF-k8qlccwDDj~>BB6VD`mb)cT4 z?q1v|U4lOUhBo#Mwe_c|iKm8rqmleyI-=LV0rGq8odRn-iHxFlHCv^Gr&tCK9!u)_ zRvB{HrUEyD^UN1an&WmO*f}bSt4h8+CYUzu7TYk%Ba*Qe?)LLxpZe?@G65S&w6pM$ z(8hjns-uHp$UB4zCXRF^CK4Gh4dml&Lechi!Zp|k2Hr;z^Z>EJ;7Mbs3Z>pdQ=zK# zo}`2hLy7dktF<^8(wsrce1ve7@Df;lgUH9)FNgC}4F-qS3n)Gw1p=^%$UBdY3le;!W^T5c9h{{6Uy1rlubqt!^oEzskG~5jXY2yK-vPZqCTnSF2l#RD8G7C9{yrAn zkE7bqF9HBH4hDm_OnNLjbUM(RYjpb1Ka$6!_m*By*MNymM@J9LM8^gA*DOB{N!!}# W*x3D;y3q5`46G;=6oS%1DE|+r?~dmH literal 0 HcmV?d00001 diff --git a/software/backend/backend_database.db b/software/backend/backend_database.db index 406143c784e401cdad9950ac830c009c0ef1ca90..665a62c517f308316f6908a77d02f3a8d22f1034 100644 GIT binary patch delta 74 zcmV-Q0JZ;sfB}Gj0g!44(f|*e4@nKuvk?$r4GMyE0|yr|F#&}WlgSPA4Rdd4Y+r3} gX>)XSa%Gdu4!#Lv0S6Zu83BPIlamiyv;PkPFn{?N8UO$Q delta 88 zcmZo@U~Fh$oRGz_pMk%N--37l#ztRWuBI|(c5y>P##ZskcX+?>rx)dy=B31El;&op sWR_G;zRS0dvxJddTvC#;(RuO`{%9T@g@T;Kyps5m%7WC*zxde<02#C$@&Et; diff --git a/software/backend/data_handling_functions.py b/software/backend/data_handling_functions.py index 1bd1ca6..9b3ba23 100644 --- a/software/backend/data_handling_functions.py +++ b/software/backend/data_handling_functions.py @@ -5,73 +5,66 @@ This file contains all functions, which handle the different cases. Every function should return json format with the wanted data from the database """ import paho.mqtt.client as mqtt +from plantdatabase import PlantDataBase -def data_handler(client: mqtt.Client, message) -> dict: +def data_handler(client: mqtt.Client, message: mqtt.MQTTMessage, mydatabase: PlantDataBase) -> None: """ main entrypoint for a message handling method - :param client: - :param message: - :return: + :param mydatabase: database with plant data + :param client: mqtt client + :param message: received message + :return: None """ - if message.topic.startwith('BackEnd'): - - if message.topic == "BackEnd/Action/All": - action_all(client, message) - elif message.topic == "BackEnd/Action/GetPosition": - action_get_position(client, message) - elif message.topic == "BackEnd/Action/GetBattery": - action_get_battery(client, message) - elif message.topic == "BackEnd/Action/GetAllData": - action_get_all_data(client, message) - - elif message.topic.startwith('Robot'): - - if message.topic == "Robot/Data/SensorData": + if message.topic.startswith('Robot'): + if message.topic == 'Robot/Action/SensorData': data_sensordata(client, message) - elif message.topic == "Robot/Data/Position": + elif message.topic == 'Robot/Action/Position': data_position(client, message) - elif message.topic == "Robot/Data/Battery": + elif message.topic == 'Robot/Action/Battery': data_battery(client, message) - elif message.topic == "Robot/Data/Picture": - data_picture(client, message) + elif message.topic.startswith('BackEnd'): + if message.topic == 'BackEnd/Action/Drive': + action_drive(client, message) + elif message.topic == 'BackEnd/Action/GetPosition': + action_getposition(client) + elif message.topic == 'BackEnd/Action/GetBattery': + action_getbattery(client) + elif message.topic == 'BackEnd/Action/GetAllData': + action_getalldata(client) -# START ACTION FUNCTION DEFINITIONS +# Robot Channel Reactions -def action_all(client, message): +def data_sensordata(client: mqtt.Client, message: mqtt.MQTTMessage): + # TODO: Store data in database pass -def action_get_position(client, message): +def data_position(client: mqtt.Client, message: mqtt.MQTTMessage): + # TODO: Publish as json pass -def action_get_battery(client, message): +def data_battery(client: mqtt.Client, message: mqtt.MQTTMessage): + # TODO: Publish as json pass -def action_get_all_data(client, message): +# FrontEnd Channel Reactions + +def action_drive(client: mqtt.Client, message: mqtt.MQTTMessage): + client.publish('Robot/Action/Drive', message.payload).decode("utf-8") + + +def action_getposition(client: mqtt.Client): + client.publish('Robot/Action/GetPosition') + + +def action_getbattery(client: mqtt.Client): + client.publish('Robot/Action/GetBattery') + + +def action_getalldata(client: mqtt.Client): + # TODO: get data from database pass - - -# END ACTION FUNCTION DEFINITIONS - -# START ROBOT FUNCTION DEFINITIONS - -def data_sensordata(client, message): - pass - - -def data_position(client, message): - pass - - -def data_battery(client, message): - pass - - -def data_picture(client, message): - pass - -# END ROBOT FUNCTION DEFINITIONS diff --git a/software/backend/dev_test_examples/mqtt_publisher.py b/software/backend/dev_test_examples/mqtt_publisher.py index e005f0b..4e65bc1 100644 --- a/software/backend/dev_test_examples/mqtt_publisher.py +++ b/software/backend/dev_test_examples/mqtt_publisher.py @@ -10,7 +10,7 @@ client.connect(mqttBroker) while True: randNumber = uniform(20.0, 21.0) - client.publish("planttest", randNumber) + client.publish("Robot/Data/Battery") print("Just published " + str(randNumber) + " to topic TEMPERATURE") time.sleep(0.5) diff --git a/software/backend/main.py b/software/backend/main.py index 872e863..dd8ed26 100644 --- a/software/backend/main.py +++ b/software/backend/main.py @@ -13,38 +13,57 @@ from defines import MQTT_BROKER_LOCAL, MQTT_BROKER_GLOBAL from plantdatabase import PlantDataBase from data_handling_functions import data_handler +# inits +mydatabase = PlantDataBase() +mydatabase.create_table() -def on_message(client, userdata, message): + +def on_message(client: mqtt.Client, userdata, message): + """ + This method gets called, if a subscribed channel gets a new message. + Message gets forwarded to the data handler + :param client: mqtt client object + :param userdata: + :param message: received message object + :return: None + """ + print(type(message)) print(f'message received! {message.topic}') - data_handler(client, message) + data_handler(client, message, mydatabase) -def on_connect(client, userdata, flags, rc): +def on_connect(client: mqtt.Client, userdata, flags, rc): + """ + This method gets called, when it connects to a mqtt broker. + It is used to subscribe to the specific topics + :param client: mqtt client object + :param userdata: + :param flags: + :param rc: connection flag + :return: + """ if rc == 0: print("connected") # TOPIC SUBSCRIPTIONS - client.subscribe("planttest") - # Robot topics - client.subscribe("Robot/Data/SensorData") - client.subscribe("Robot/Data/Position") - client.subscribe("Robot/Data/Battery") - client.subscribe("Robot/Data/Picture") - # FrontEnd topics - client.subscribe("BackEnd/Action/All") - client.subscribe("BackEnd/Action/GetPosition") - client.subscribe("BackEnd/Action/GetBattery") - client.subscribe("BackEnd/Action/GetAllData") + # From Robot: + client.subscribe('Robot/Data/SensorData') + client.subscribe('Robot/Data/Position') + client.subscribe('Robot/Data/Battery') + # client.subscribe('Robot/Data/Picture') + # From FrontEnd: + client.subscribe('BackEnd/Action/Drive') + client.subscribe('BackEnd/Action/GetPosition') + client.subscribe('BackEnd/Action/GetBattery') + client.subscribe('BackEnd/Action/GetAllData') # END TOPIC SUBSCRIPTIONS else: print("connection failed") def main(): - mydatabase = PlantDataBase() - mydatabase.create_table() client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message diff --git a/software/backend/plantdatabase.py b/software/backend/plantdatabase.py index 3a8b27c..e217faa 100644 --- a/software/backend/plantdatabase.py +++ b/software/backend/plantdatabase.py @@ -19,8 +19,7 @@ class PlantDataBase: def create_table(self): table_config = "CREATE TABLE IF NOT EXISTS plants " \ "(plant_ID INTEGER PRIMARY KEY AUTOINCREMENT," \ - " gps TEXT," \ - " plant_type TEXT)" + " gps TEXT)" self.cur.execute(table_config) table_config = "CREATE TABLE IF NOT EXISTS measurement_values " \ @@ -29,7 +28,7 @@ class PlantDataBase: "plant_ID INTEGER, " \ "sensordata_temp REAL," \ "sensordata_humidity REAL," \ - "sensordata_ground_humidity REAL," \ + "sensordata_soil_moisture REAL," \ "pest_infestation INTEGER," \ "light_intensity REAL," \ "FOREIGN KEY (plant_ID)" \ @@ -47,7 +46,7 @@ class PlantDataBase: pest_infestation, light_intensity): self.cur.execute(f"INSERT INTO measurement_values (plant_ID, sensordata_temp, sensordata_humidity," - f" sensordata_ground_humidity, pest_infestation, light_intensity) VALUES " + f" sensordata_soil_moisture, pest_infestation, light_intensity) VALUES " f"({plant_id}, {sensordata_temp}, {sensordata_humidity}, {sensordata_ground_humidity}, {pest_infestation}" f", {light_intensity})") self.conn.commit() @@ -66,7 +65,7 @@ class PlantDataBase: "timestamp": data[1], "sensordata_temp": data[3], "sensordata_humidity": data[4], - "sensordata_ground_humidity": data[5], + "sensordata_soil_moisture": data[5], "pest_infestation": data[6], "light_intensity": data[7] }