From 04ad35a91fdc2f2c89f40c8419c82604f56c1ea6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20H=C3=A4fliger?= Date: Thu, 18 Apr 2024 17:27:48 +0200 Subject: [PATCH] =?UTF-8?q?Weiterarbeit=20Users,=20Server=20implementier?= =?UTF-8?q?=20f=C3=BCr=20Config-Data=20austausch,=20Data=20funktioniert=20?= =?UTF-8?q?noch=20nicht=20korrekt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__pycache__/JsonHandling.cpython-38.pyc | Bin 0 -> 2323 bytes client/__pycache__/energymeter.cpython-38.pyc | Bin 0 -> 3900 bytes .../__pycache__/energyproducer.cpython-38.pyc | Bin 0 -> 3910 bytes client/__pycache__/energyuser.cpython-38.pyc | Bin 0 -> 6508 bytes client/__pycache__/main.cpython-38.pyc | Bin 0 -> 5826 bytes .../__pycache__/serverrequests.cpython-38.pyc | Bin 0 -> 827 bytes .../__pycache__/serverrequests.cpython-39.pyc | Bin 690 -> 560 bytes client/data.json | 2 +- client/engine.py | 13 +- client/serverrequests.py | 43 +++-- server/config/BasToken.json | 20 +++ server/data/BasToken.json | 1 + server/json_merger.py | 42 +++++ server/main.py | 154 +++++++++++++----- 14 files changed, 208 insertions(+), 67 deletions(-) create mode 100644 client/__pycache__/JsonHandling.cpython-38.pyc create mode 100644 client/__pycache__/energymeter.cpython-38.pyc create mode 100644 client/__pycache__/energyproducer.cpython-38.pyc create mode 100644 client/__pycache__/energyuser.cpython-38.pyc create mode 100644 client/__pycache__/main.cpython-38.pyc create mode 100644 client/__pycache__/serverrequests.cpython-38.pyc create mode 100644 server/config/BasToken.json create mode 100644 server/data/BasToken.json create mode 100644 server/json_merger.py diff --git a/client/__pycache__/JsonHandling.cpython-38.pyc b/client/__pycache__/JsonHandling.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e314c5614a267d72b053d3dd2f946beee531189 GIT binary patch literal 2323 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 literal 0 HcmV?d00001 diff --git a/client/__pycache__/energyproducer.cpython-38.pyc b/client/__pycache__/energyproducer.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59b639033290520bd7668c952cadcacc4a2707f6 GIT binary patch literal 3910 zcmcf^ZEqYk)AqjJv{QuRKL;jPpsP0l2!eY?j8o1YkjUW5kR-;lD9M^vIiSuHCt3sdtXm?lp9Qi81bevH8Mu?*o;VC@fVaH~U7ZE6MN0DJ zi+faqCuzFRq^rSqG`tMy;&{)&@xN@x-K?y%9pwdE&rN6{8C;pNZ7M~gMO=FoejDGFMJL`?MR)m9 zUZhE`E(1~vHI15A$)`cK#G6|RjiYvz2|Dnma-q;OyGcjHF=9MR!AFg6FIpKFMH??K z60VG&^m?MpK|lk^F;8@2nzgb*Me~)LjZO&PTb>5Epsd&{)Ea8WQme;h!dlFj;(+tROfC;Odem z@k;IMk&xMl#JFL@Gc27({3QTUSbMjborq7-Y`tK8ZrY=s!5Ed~`D9R2FMvq(G62F( zf(tci$b5jd{ptrWrzhzt+fK7*=-{O(=Q>_$dnuI9gG|$muSaEPCv=3S10FS z*{W$;5J+^ER#95Miu6?k81TmchGlCU^iqY3;PYPSGTNMD)UKpJocLiRx&mFD0r0qF z%sq^frcvMV`M)RMN(c6o0Rnte)0&|E??4|h)Xg+H>^r*|w z>lF6f!@VBKUhN~#UY~pe1z{oc@Vdt2+8wO$3&4V1VKEW1(3d#-d#+>kU%QSC)L^Ve z8C}QfKXV-);(q9&gbqg6vAX=|b;!4Y=UBs|2UXD;5HNfok@A-eA6%71H|wi^&Fr_} z#N%e4A0FU%qvKl|<*0R=qe`+(zJpxxKWC4AO9v-3J%9=Z3MdAd1#;IthPg?uLY{&` ztIIgSyz?!UbESI#c_<@?kiob&9R1-KRHODlzAdV-_&SC^d@R3zEPvy%{K2vO&ByYG zr32-k4@FHbngqPg}fz_TxT7z4kgfXx|O}RnHD|qpUqvRMdzpg!_64? z{etfr7dfKl`r4g%qrGwK+8yJ6iZ!%~oSSPOM6KH&-(LH0xD?IY*;uybRH7oxvDWnhway}@epqX{@BW3q4wWD@{r$!EpOuHqX>!= uFvN2(SY;(f@2Wb$;A$VbM5Zx4MiJSBm#Vyb8Ecg~TS9W5J3l`=Kl>XUxmGX$ literal 0 HcmV?d00001 diff --git a/client/__pycache__/energyuser.cpython-38.pyc b/client/__pycache__/energyuser.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97ff020fb68973582627868f7bf3fb7b620fd529 GIT binary patch literal 6508 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 literal 0 HcmV?d00001 diff --git a/client/__pycache__/main.cpython-38.pyc b/client/__pycache__/main.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ace85c352f2e1801299171a3faf1e8e2352996d3 GIT binary patch literal 5826 zcmd^D&u`qu6`mP#xm;=`%aZF@sq3Kw=v$a=c~jLX zkKbkG;tNQ@DrKHddH$x`4r4E<#Wfln{Rwog2UFklYhb8H7|~RCNzx))@pe zygbISJvJz$*3G6b>wD{wFKfi7|D!f3<7c>{8z2ckfI1F&!W^#J!qW}~dP4Q|UQhFK z7()*LQ5-ecI$sHEb~jkM6lcFv9rT9SixS_oUUZPmYbWTsl(k0tFbb3_c9p$A^* zr&CzxIlhuOovyW|^qaA>)B41h>3qNI`C;s4gGVCOBR||sjasX@8Pt!MoCUXkUA(<= z-<2DF5Jzzk`{8(}76xE@zu^YW#hty>bey0W#EwIr6U~4yUgR_Q8|vSgAF6P%Klhj} zNuNrWMKoe)a-TneouCs@>0G?q-l&Cc6#0?eXh*RfGwugbBeKd z*^yT1%&td4vuv<3@0TeBU7~O0|6|dk`XrFa8du!RN5g z|Ij6rj$i2#S4kNs1Wx4=%m1-U$hW~?zC+|?roK)R^kSYe_425x(3gj%B&06W z+7VM)l17i2Qp4bNnz{tiN4KxS<5RZJt2){$6{DR)Th#+-1M3KxW_o%U!q(hc+>(1^ zQJ4fE@F|FdXk__421sJDz_zpl{gByGfF~bc?dl0a%mVA? zaL?gxBpl=CyZI!S(2YkrFM?K|Yt*9qwnq2gi(UP0rf6gaD*%e4*lpJQRFC&|d>V;*iBLt*vPi|^ zQmWO$Xv8{MK3ffgD6X{{JJ;@z5EOq6CYXi4$vRh$DRZ$VeK+=+8VMrgwLpMZTN_FCx=E9ciA;Y;l zJATu{+5!zbo*TQV)qgY0E@qL-QJbZ@dY+X;BTc0dDtM%m6)&mTXECXa*~xdiMJgdI zF!83)xh0Am$q9dp&xuaytCch6-4y-@8HVCt%nmrY-=XL-*cnd8VSl)ZR#9m`_}dgz zr%B4vX`b>u#p3UyhvJ31lj47yGIqaub04}v=x!i6tD2#TMZH8%@6dVoxa_Z3Jr)%y zPg9s8phg~E3Xa)BQKFEu&(9HZcp_A?QDDuU5Q>15A3f*K_?D1Mu@>ub4sGBh&S!To z_XgX?%4gg$fEsPf%+k1L{toJi3n=hWj}xDLs-1vEaQy3Y_8Hsco`s`=nLPtKbJ3r7 zp8&;1lEa(}&v{}TSf6pso1%HNA8}C#{YzqCry>;$*-qZHH-mk!61xD&;IMRGJm+0A z5s8^V+68uwZRg~dqy3-a&9kSgZ1+pG?-_dAgQ;uB_OlLD3_ki#!x@qu9lPVvGHXA>as=<2jBzk_u&1wLiu! z)d>faep6Vj14xf{Nsgi-92E;H!p&ro zPR24W$+sk-ZbC+R8Dl;!<--)94Ay!7xDUTdzCm<)K|mank_JedN=nifY9_k)CW5wH z!vM-_3e=L~;}O93XhOi$Tn*jEhUZ>uV8%ajvCdCkQ@(6Hpsj8D<4KET`$}soIgfZI z=Se!G0KbE4VBs+x5PvfLJk6lmQCVs(v(z)TtuoL^=8?a^9H>S46>mdqQyoNucrVk9 zs^Q3P5nYsXv&8c9UCEEtuJGh%2rHXnbU&&l`upj027+(j#@NJe9So^Aq}|5$8nZIh z0SUs^0>xWVksl5?{d~}(9i@7WkI?E;uL3g0w68YhI#kaF1VxL~=CMDhL=8D<>rBoQ z43k=`>T?7o;ZHGfpetbTHGO=*r}NHQ&~!r^bwTXg?q=*udjJk9`c+m~>4+7(JcHca zZb-^2(gsO&f=Zf0!m0Z>cm~a^TE}-DJd0W~#sWW14gXP${HzXo*$IKrQ7*_;+$2&L ztDcfR9sjXmFAbfh?+?A$k>%~G)pMJ`kE-(#9WDEQ)SFOn!_ZNO-s-H%<5}pzwARCF zVQ?f?`h|o1l6F^)L8ePj4_>>!?{6_2y$8a?S)3_mG!x$+O4_V8hu$2{8A8KZgP+I9 zj8+u0VwPK&b4F0+@4WRjP+cic9(vLuSt6)q-yY-#*j(Nua-WEDv>{P0cM%UL@(vmU8;9VE00TAh2uPMBd7L&%;%Nt6}z-l>RzI$s!%Ge z*uO!?wjY$Zj@F^>o~sSfm*1{Qd+rusWkY?R9ac?D$ZY< z*_Cl-SH_sV_nOR>$C)jUF}w1A%?zqJ!J6>FSL*EQ$vXSS%;07Sg_cz=%J<>4@(K}E z%@#jIMSmL=ZHU;APSsjr=-1+))r=%X)YQr_uF4gvAJnm59T=7S%M}_MB4!Y&k%zNy cQr9TtMpSWR6}yRVjcAFPv$ONFXJ$V7H@21}IsgCw literal 0 HcmV?d00001 diff --git a/client/__pycache__/serverrequests.cpython-38.pyc b/client/__pycache__/serverrequests.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..863fb317ede14d57ecd8f92252fd5334725a2012 GIT binary patch literal 827 zcmZuv!EVz)5Zzs`V>czGTzW$oiHjvfa-f$8p-S{nI0T7^OH?T`-c4fHiPN1msF8Ey z$`=4qd+eX^4SVI(U+9UMxUE`=m3DUL&Fq_*XMgT=+6-42KA-rKvA^WpUjm&2-0%X8 zVu}}R)SP_8l~CSyHWErIA5Ty5A&XmAn8^kyr{iWJGo$?uHyof*e2uSbmhrW)Eax?^ zk?V(8d$pG%--$3UYwz5OR@p7m0 z5jvisH<)C^bM6`(~S7_^O&O!Gwfw zk)b~ngEYRARLgV-ra{dP84|fMyLfXUwltW~rnfY=|B0KO8jO7m3$vSFlUU^Cu`CTVyhA^j>> zX_L+bbk2p_Ytrw@4|c+!3t2?3**BqS8W2`IIacdt6Qsuu?k`rU)###4Rbw;{MmgsJXP)^>fnP8X#RIfqv>|19^EBv`mn%G zy=b>QRxo}*;t2ng1mlutbY6%Jo(cDikV3eO)Y@K8d?aE?o4vlUFgN&y{sr^#c{A}B D{QQ%s literal 690 zcmY*Xzi-qq6t*4bE=^nM=)w&QHzBgzkBTlQD2Pgksml$BsFD@pcMvY;q_$JIQ#&0y z{{RDw{3rYkUYWWv!@^5as_V1fr}wPS-}~$&+20Qd#_Vr@{+ki5 zq&bO+WYYUgVhT+11=C~c$DZuSt_;4im;(h5_=Ztr&q%a$jVH-zit4xFV-;YYV44>Q z7P*pb*q8nlyJX+!cXH*u#(5mq#-l{_Cd51%6WXjdh?m}sSYLKG6l;!ig41=F7HXco z8`@9SQN13$x3-*)MysOI!hpU2EwXZYG#-yfRVfn-qCN1;77I{MBkK4EQ>g2o=xF`m zq!AmmOgS)Bnu0O&D$iHLb^m3OzixQOM8WQOO4d)dYYaA~NW8JQ? ziLDF{mf-wSXUayt^BV)M(`qHnlKed-NgWym@98PmLP=Qt@rk7sHbkhJ#1a@WLd~6hhvJJ OsejOb1-*cA8q$BesJ#II diff --git a/client/data.json b/client/data.json index 41d7638..09a0eec 100644 --- a/client/data.json +++ b/client/data.json @@ -1 +1 @@ -{"timestamps": ["2024-04-12 16:43"], "Producer_sum": {"values": {"success": [true], "day_energy": [205790], "pac": [19349], "total_energy": [58877902], "year_energy": [7792097]}}, "Fronius_15kW": {"values": {"success": [true], "day_energy": [84970], "pac": [8075], "total_energy": [30943902], "year_energy": [3146688]}}, "Fronius_20kW": {"values": {"success": [true], "day_energy": [120820], "pac": [11274], "total_energy": [27934000], "year_energy": [4645409]}}, "Meter_Sum": {"values": {"success": [true], "Current_AC_Phase_1": [-10.55], "Current_AC_Phase_2": [-21.65], "Current_AC_Phase_3": [-19.2], "PowerReal_P_Sum": [-11792.6]}}, "Meter_Fronius": {"values": {"success": [true], "Current_AC_Phase_1": [-10.55], "Current_AC_Phase_2": [-21.65], "Current_AC_Phase_3": [-19.2], "PowerReal_P_Sum": [-11792.6]}}, "User_data": {"values": {"Current_Power": [0], "Used_Energy": [0], "Current_Prio": [0], "Current_deltaPower": [0], "measured_Temp": [0]}}, "Umod1": {"values": {"Current_Power": [0], "Used_Energy": [6], "Current_Prio": [1], "Current_deltaPower": [0], "measured_Temp": [0]}}, "Umod3": {"values": {"Current_Power": [0], "Used_Energy": [6], "Current_Prio": [3], "Current_deltaPower": [0], "measured_Temp": [0]}}, "Umod2.0": {"values": {"Current_Power": [0], "Used_Energy": [6], "Current_Prio": [2], "Current_deltaPower": [0], "measured_Temp": [0]}}, "Umod2.1": {"values": {"Current_Power": [0], "Used_Energy": [6], "Current_Prio": [2], "Current_deltaPower": [0], "measured_Temp": [0]}}, "Umod2.2": {"values": {"Current_Power": [0], "Used_Energy": [6], "Current_Prio": [2], "Current_deltaPower": [0], "measured_Temp": [0]}}, "Umod2.3": {"values": {"Current_Power": [0], "Used_Energy": [6], "Current_Prio": [2], "Current_deltaPower": [0], "measured_Temp": [0]}}, "Usta2.0": {"values": {"Current_Power": [0], "Used_Energy": [4], "Current_Prio": [2], "Current_deltaPower": [0], "measured_Temp": [0]}}, "Usta2.1": {"values": {"Current_Power": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "Used_Energy": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4], "Current_Prio": [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], "Current_deltaPower": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}, "shelly_Boiler": {"values": {"Current_Power": [0], "Used_Energy": [0], "Current_Prio": [2], "Current_deltaPower": [0], "measured_Temp": [25.19]}}} \ No newline at end of file +{"timestamps": ["2024-04-18 17:18", "2024-04-18 17:19", "2024-04-18 17:20", "2024-04-18 17:21", "2024-04-18 17:22", "2024-04-18 17:23", "2024-04-18 17:24"], "Producer_sum": {"values": {"success": [true, true, true, true, true, true, true], "day_energy": [35718, 35866, 35991, 36109, 36236, 36329, 36438], "pac": [7995, 8083, 7758, 7083, 6439, 6084, 5755], "total_energy": [59811200, 59811300, 59811400, 59811604, 59811604, 59811804, 59811902], "year_energy": [8725390, 8725539, 8725663, 8725781, 8725906, 8725999, 8726110]}}, "Fronius_15kW": {"values": {"success": [true, true, true, true, true, true, true], "day_energy": [17347, 17409, 17461, 17512, 17564, 17603, 17649], "pac": [3359, 3388, 3251, 2959, 2688, 2538, 2393], "total_energy": [31330000, 31330100, 31330100, 31330202, 31330202, 31330302, 31330302], "year_energy": [3532817, 3532880, 3532932, 3532982, 3533033, 3533072, 3533119]}}, "Fronius_20kW": {"values": {"success": [true, true, true, true, true, true, true], "day_energy": [18371, 18457, 18530, 18597, 18672, 18726, 18789], "pac": [4636, 4695, 4507, 4124, 3751, 3546, 3362], "total_energy": [28481200, 28481200, 28481300, 28481402, 28481402, 28481502, 28481600], "year_energy": [5192573, 5192659, 5192731, 5192799, 5192873, 5192927, 5192991]}}, "Meter_Sum": {"values": {"success": [true, true, true, true, true, true, true], "Current_AC_Phase_1": [5, 4.45, 6.4, 7.25, 11.2, 6.3, 9], "Current_AC_Phase_2": [5.75, 5.45, 6.5, 7.5, 7.5, 2.714, 2.175], "Current_AC_Phase_3": [-4.55, -4.6, -4.3, -3.9, 7.55, 4.4, 4.7], "PowerReal_P_Sum": [443, 200.8, 1714.5, 1879.3, 5569.2, 2260.1, 3062.9]}}, "Meter_Fronius": {"values": {"success": [true, true, true, true, true, true, true], "Current_AC_Phase_1": [5, 4.45, 6.4, 7.25, 11.2, 6.3, 9], "Current_AC_Phase_2": [5.75, 5.45, 6.5, 7.5, 7.5, 2.714, 2.175], "Current_AC_Phase_3": [-4.55, -4.6, -4.3, -3.9, 7.55, 4.4, 4.7], "PowerReal_P_Sum": [443, 200.8, 1714.5, 1879.3, 5569.2, 2260.1, 3062.9]}}, "User_data": {"values": {"Current_Power": [0, 0, 0, 0, 0, 0, 0], "Used_Energy": [0, 0, 0, 0, 0, 0, 0], "Current_Prio": [0, 0, 0, 0, 0, 0, 0], "Current_deltaPower": [0, 0, 0, 0, 0, 0, 0], "measured_Temp": [0, 0, 0, 0, 0, 0, 0]}}, "Umod1": {"values": {"Current_Power": [0, 0, 0, 0, 0, 0, 0], "Used_Energy": [6, 6, 6, 6, 6, 6, 6], "Current_Prio": [1, 1, 1, 1, 1, 1, 1], "Current_deltaPower": [0, 0, 0, 0, 0, 0, 0], "measured_Temp": [0, 0, 0, 0, 0, 0, 0]}}, "Umod3": {"values": {"Current_Power": [0, 0, 0, 0, 0, 0, 0], "Used_Energy": [6, 6, 6, 6, 6, 6, 6], "Current_Prio": [3, 3, 3, 3, 3, 3, 3], "Current_deltaPower": [0, 0, 0, 0, 0, 0, 0], "measured_Temp": [0, 0, 0, 0, 0, 0, 0]}}, "Umod2.0": {"values": {"Current_Power": [0, 0, 0, 0, 0, 0, 0], "Used_Energy": [6, 6, 6, 6, 6, 6, 6], "Current_Prio": [2, 2, 2, 2, 2, 2, 2], "Current_deltaPower": [0, 0, 0, 0, 0, 0, 0], "measured_Temp": [0, 0, 0, 0, 0, 0, 0]}}, "Umod2.1": {"values": {"Current_Power": [0, 0, 0, 0, 0, 0, 0], "Used_Energy": [6, 6, 6, 6, 6, 6, 6], "Current_Prio": [2, 2, 2, 2, 2, 2, 2], "Current_deltaPower": [0, 0, 0, 0, 0, 0, 0], "measured_Temp": [0, 0, 0, 0, 0, 0, 0]}}, "Umod2.2": {"values": {"Current_Power": [0, 0, 0, 0, 0, 0, 0], "Used_Energy": [6, 6, 6, 6, 6, 6, 6], "Current_Prio": [2, 2, 2, 2, 2, 2, 2], "Current_deltaPower": [0, 0, 0, 0, 0, 0, 0], "measured_Temp": [0, 0, 0, 0, 0, 0, 0]}}, "Umod2.3": {"values": {"Current_Power": [0, 0, 0, 0, 0, 0, 0], "Used_Energy": [6, 6, 6, 6, 6, 6, 6], "Current_Prio": [2, 2, 2, 2, 2, 2, 2], "Current_deltaPower": [0, 0, 0, 0, 0, 0, 0], "measured_Temp": [0, 0, 0, 0, 0, 0, 0]}}, "Usta2.0": {"values": {"Current_Power": [0, 0, 0, 0, 0, 0, 0], "Used_Energy": [4, 4, 4, 4, 4, 4, 4], "Current_Prio": [2, 2, 2, 2, 2, 2, 2], "Current_deltaPower": [0, 0, 0, 0, 0, 0, 0], "measured_Temp": [0, 0, 0, 0, 0, 0, 0]}}, "shelly_Boiler": {"values": {"Current_Power": [0, 0, 0, 0, 0, 0, 0], "Used_Energy": [0, 0, 0, 0, 0, 0, 0], "Current_Prio": [2, 2, 2, 2, 2, 2, 2], "Current_deltaPower": [0, 0, 0, 0, 0, 0, 0], "measured_Temp": [20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56]}}} \ No newline at end of file diff --git a/client/engine.py b/client/engine.py index 8a6528f..455418e 100644 --- a/client/engine.py +++ b/client/engine.py @@ -8,9 +8,10 @@ import time import datetime import json import main +import serverrequests # Gehe in eine Dauerschlaufe -ID = "SRING_TO_DEFINE" +ID = "BasToken" producer_values = [] producers =[] @@ -23,16 +24,15 @@ users = [] Collector = JsonHandling.DataCollector() data = {} - def calcSomeStuff(): return while True: - # Neue Konfig holen - config = serverrequests.update_config_on_server(ID, data) + config = json.dumps(serverrequests.get_config(ID)) + if JsonHandling.JsonHandling.check_config_has_changed(config): producers = energyproducer.EnergyProducer.create_producerlist_from_json(config) meter = energymeter.EnergyMeter.create_meterlist_from_json(config) @@ -45,10 +45,13 @@ while True: for user in users: user.calc_used_power() - main.EnergyUserFactory.distribute_energy(users, meter_values["Meter_Sum"]["PowerReal_P_Sum"]) + main.EnergyUserFactory.distribute_energy(users, -1*(meter_values["Meter_Sum"]["PowerReal_P_Sum"])) user_values = energyuser.EnergyUser.get_all_current_values(users) Collector.collect_and_store_data(producer_values, meter_values, user_values) data = Collector.data + serverrequests.set_data(ID, data) + + time.sleep(5) \ No newline at end of file diff --git a/client/serverrequests.py b/client/serverrequests.py index 3d5664d..45d4624 100644 --- a/client/serverrequests.py +++ b/client/serverrequests.py @@ -1,23 +1,30 @@ import requests +import json + +def get_config(token_id): + url = 'http://localhost:5000/getconfig' + headers = {'ID': token_id} + response = requests.post(url, headers=headers) -def update_config_on_server(token, config): - ## For developement now just return json from here - with open("config.txt", 'r') as file: - json_data = file.read() - - return json_data - - - ## For server later - response = requests.post(f'http://your_server_ip:5000/update_config?token={token}', json=config) if response.status_code == 200: - print('Config updated successfully.') + return response.json() else: - print('Failed to update config.') - return response + return {'error': f'Request failed with status code {response.status_code}'} -if __name__ == '__main__': - # Beispiel für die Verwendung der Funktion update_config_on_server - token = 'your_token' - config = {'key1': 'new_value1', 'key2': 'new_value2'} - update_config_on_server(token, config) \ No newline at end of file +def set_data(token_id, data): + url = 'http://localhost:5000/setdata' + headers = {'ID': token_id, 'JSON': json.dumps(data)} + response = requests.post(url, headers=headers) + + if response.status_code == 200: + return {'message': 'Data sent successfully'} + else: + return {'error': f'Request failed with status code {response.status_code}'} + +# Beispielaufrufe: +# config = get_config('token123') +# print(config) + +# new_data = {'timestamps': ['2024-04-18 13:31', '2024-04-18 13:32'], 'Producer_sum': {'values': {'success': [True, True], 'day_energy': [6386, 6458], ...}}} +# response = set_data('token123', new_data) +# print(response) diff --git a/server/config/BasToken.json b/server/config/BasToken.json new file mode 100644 index 0000000..b2e86ef --- /dev/null +++ b/server/config/BasToken.json @@ -0,0 +1,20 @@ + { + "metadata":{"config_has_changed" : "1"}, + "users": [ + {"type": "User1", "config": {"ID":"Umod1","user_prio":1,"lock_prio":2}}, + {"type": "User1", "config": {"ID":"Umod3","user_prio":3,"lock_prio":4}}, + {"type": "User1", "config": {"ID":"Umod2.0","user_prio":2,"lock_prio":3}}, + {"type": "User1", "config": {"ID":"Umod2.1","user_prio":2,"lock_prio":3}}, + {"type": "User1", "config": {"ID":"Umod2.2","user_prio":2,"lock_prio":3}}, + {"type": "User1", "config": {"ID":"Umod2.3","user_prio":2,"lock_prio":3}}, + {"type": "User2", "config": {"ID":"Usta2.0","user_prio":2,"lock_prio":6}}, + {"type": "Boiler_1Stufig_Shelly", "config": {"ID":"shelly_Boiler","user_prio":2,"lock_prio":6, "shelly_ip" : "192.168.20.233", "boilerpower": 5000, "temperatur": 38}} + ], + "producers": [ + {"type": "Fronius", "config": {"ID":"Fronius_15kW","IP":"192.168.20.51","Adr":1}}, + {"type": "Fronius", "config": {"ID":"Fronius_20kW","IP":"192.168.20.51","Adr":2}} + ], + "meters": [ + {"type": "Fronius", "config": {"ID":"Meter_Fronius","IP":"192.168.20.51","Adr":1}} + ] + } \ No newline at end of file diff --git a/server/data/BasToken.json b/server/data/BasToken.json new file mode 100644 index 0000000..c1fbe32 --- /dev/null +++ b/server/data/BasToken.json @@ -0,0 +1 @@ +{"timestamps": ["2024-04-18 17:18", "2024-04-18 17:19", "2024-04-18 17:20", "2024-04-18 17:21", "2024-04-18 17:22", "2024-04-18 17:23", "2024-04-18 17:24"], "Producer_sum": {"values": {"success": [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true], "day_energy": [35718, 35866, 35991, 36109, 36236, 36329, 35718, 35866, 35991, 36109, 36236, 36329, 35718, 35866, 35991, 36109, 36236, 36329, 36438, 35718, 35866, 35991, 36109, 36236, 36329, 36438, 35718, 35866, 35991, 36109, 36236, 36329, 36438], "pac": [7995, 8083, 7758, 7083, 6439, 6084, 7995, 8083, 7758, 7083, 6439, 6084, 7995, 8083, 7758, 7083, 6439, 6084, 5755, 7995, 8083, 7758, 7083, 6439, 6084, 5755, 7995, 8083, 7758, 7083, 6439, 6084, 5755], "total_energy": [59811200, 59811300, 59811400, 59811604, 59811604, 59811804, 59811200, 59811300, 59811400, 59811604, 59811604, 59811804, 59811200, 59811300, 59811400, 59811604, 59811604, 59811804, 59811902, 59811200, 59811300, 59811400, 59811604, 59811604, 59811804, 59811902, 59811200, 59811300, 59811400, 59811604, 59811604, 59811804, 59811902], "year_energy": [8725390, 8725539, 8725663, 8725781, 8725906, 8725999, 8725390, 8725539, 8725663, 8725781, 8725906, 8725999, 8725390, 8725539, 8725663, 8725781, 8725906, 8725999, 8726110, 8725390, 8725539, 8725663, 8725781, 8725906, 8725999, 8726110, 8725390, 8725539, 8725663, 8725781, 8725906, 8725999, 8726110]}}, "Fronius_15kW": {"values": {"success": [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true], "day_energy": [17347, 17409, 17461, 17512, 17564, 17603, 17347, 17409, 17461, 17512, 17564, 17603, 17347, 17409, 17461, 17512, 17564, 17603, 17649, 17347, 17409, 17461, 17512, 17564, 17603, 17649, 17347, 17409, 17461, 17512, 17564, 17603, 17649], "pac": [3359, 3388, 3251, 2959, 2688, 2538, 3359, 3388, 3251, 2959, 2688, 2538, 3359, 3388, 3251, 2959, 2688, 2538, 2393, 3359, 3388, 3251, 2959, 2688, 2538, 2393, 3359, 3388, 3251, 2959, 2688, 2538, 2393], "total_energy": [31330000, 31330100, 31330100, 31330202, 31330202, 31330302, 31330000, 31330100, 31330100, 31330202, 31330202, 31330302, 31330000, 31330100, 31330100, 31330202, 31330202, 31330302, 31330302, 31330000, 31330100, 31330100, 31330202, 31330202, 31330302, 31330302, 31330000, 31330100, 31330100, 31330202, 31330202, 31330302, 31330302], "year_energy": [3532817, 3532880, 3532932, 3532982, 3533033, 3533072, 3532817, 3532880, 3532932, 3532982, 3533033, 3533072, 3532817, 3532880, 3532932, 3532982, 3533033, 3533072, 3533119, 3532817, 3532880, 3532932, 3532982, 3533033, 3533072, 3533119, 3532817, 3532880, 3532932, 3532982, 3533033, 3533072, 3533119]}}, "Fronius_20kW": {"values": {"success": [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true], "day_energy": [18371, 18457, 18530, 18597, 18672, 18726, 18371, 18457, 18530, 18597, 18672, 18726, 18371, 18457, 18530, 18597, 18672, 18726, 18789, 18371, 18457, 18530, 18597, 18672, 18726, 18789, 18371, 18457, 18530, 18597, 18672, 18726, 18789], "pac": [4636, 4695, 4507, 4124, 3751, 3546, 4636, 4695, 4507, 4124, 3751, 3546, 4636, 4695, 4507, 4124, 3751, 3546, 3362, 4636, 4695, 4507, 4124, 3751, 3546, 3362, 4636, 4695, 4507, 4124, 3751, 3546, 3362], "total_energy": [28481200, 28481200, 28481300, 28481402, 28481402, 28481502, 28481200, 28481200, 28481300, 28481402, 28481402, 28481502, 28481200, 28481200, 28481300, 28481402, 28481402, 28481502, 28481600, 28481200, 28481200, 28481300, 28481402, 28481402, 28481502, 28481600, 28481200, 28481200, 28481300, 28481402, 28481402, 28481502, 28481600], "year_energy": [5192573, 5192659, 5192731, 5192799, 5192873, 5192927, 5192573, 5192659, 5192731, 5192799, 5192873, 5192927, 5192573, 5192659, 5192731, 5192799, 5192873, 5192927, 5192991, 5192573, 5192659, 5192731, 5192799, 5192873, 5192927, 5192991, 5192573, 5192659, 5192731, 5192799, 5192873, 5192927, 5192991]}}, "Meter_Sum": {"values": {"success": [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true], "Current_AC_Phase_1": [5, 4.45, 6.4, 7.25, 11.2, 6.3, 5, 4.45, 6.4, 7.25, 11.2, 6.3, 5, 4.45, 6.4, 7.25, 11.2, 6.3, 9, 5, 4.45, 6.4, 7.25, 11.2, 6.3, 9, 5, 4.45, 6.4, 7.25, 11.2, 6.3, 9], "Current_AC_Phase_2": [5.75, 5.45, 6.5, 7.5, 7.5, 2.714, 5.75, 5.45, 6.5, 7.5, 7.5, 2.714, 5.75, 5.45, 6.5, 7.5, 7.5, 2.714, 2.175, 5.75, 5.45, 6.5, 7.5, 7.5, 2.714, 2.175, 5.75, 5.45, 6.5, 7.5, 7.5, 2.714, 2.175], "Current_AC_Phase_3": [-4.55, -4.6, -4.3, -3.9, 7.55, 4.4, -4.55, -4.6, -4.3, -3.9, 7.55, 4.4, -4.55, -4.6, -4.3, -3.9, 7.55, 4.4, 4.7, -4.55, -4.6, -4.3, -3.9, 7.55, 4.4, 4.7, -4.55, -4.6, -4.3, -3.9, 7.55, 4.4, 4.7], "PowerReal_P_Sum": [443, 200.8, 1714.5, 1879.3, 5569.2, 2260.1, 443, 200.8, 1714.5, 1879.3, 5569.2, 2260.1, 443, 200.8, 1714.5, 1879.3, 5569.2, 2260.1, 3062.9, 443, 200.8, 1714.5, 1879.3, 5569.2, 2260.1, 3062.9, 443, 200.8, 1714.5, 1879.3, 5569.2, 2260.1, 3062.9]}}, "Meter_Fronius": {"values": {"success": [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true], "Current_AC_Phase_1": [5, 4.45, 6.4, 7.25, 11.2, 6.3, 5, 4.45, 6.4, 7.25, 11.2, 6.3, 5, 4.45, 6.4, 7.25, 11.2, 6.3, 9, 5, 4.45, 6.4, 7.25, 11.2, 6.3, 9, 5, 4.45, 6.4, 7.25, 11.2, 6.3, 9], "Current_AC_Phase_2": [5.75, 5.45, 6.5, 7.5, 7.5, 2.714, 5.75, 5.45, 6.5, 7.5, 7.5, 2.714, 5.75, 5.45, 6.5, 7.5, 7.5, 2.714, 2.175, 5.75, 5.45, 6.5, 7.5, 7.5, 2.714, 2.175, 5.75, 5.45, 6.5, 7.5, 7.5, 2.714, 2.175], "Current_AC_Phase_3": [-4.55, -4.6, -4.3, -3.9, 7.55, 4.4, -4.55, -4.6, -4.3, -3.9, 7.55, 4.4, -4.55, -4.6, -4.3, -3.9, 7.55, 4.4, 4.7, -4.55, -4.6, -4.3, -3.9, 7.55, 4.4, 4.7, -4.55, -4.6, -4.3, -3.9, 7.55, 4.4, 4.7], "PowerReal_P_Sum": [443, 200.8, 1714.5, 1879.3, 5569.2, 2260.1, 443, 200.8, 1714.5, 1879.3, 5569.2, 2260.1, 443, 200.8, 1714.5, 1879.3, 5569.2, 2260.1, 3062.9, 443, 200.8, 1714.5, 1879.3, 5569.2, 2260.1, 3062.9, 443, 200.8, 1714.5, 1879.3, 5569.2, 2260.1, 3062.9]}}, "User_data": {"values": {"Current_Power": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "Used_Energy": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "Current_Prio": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "Current_deltaPower": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "measured_Temp": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}, "Umod1": {"values": {"Current_Power": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "Used_Energy": [6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6], "Current_Prio": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], "Current_deltaPower": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "measured_Temp": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}, "Umod3": {"values": {"Current_Power": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "Used_Energy": [6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6], "Current_Prio": [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], "Current_deltaPower": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "measured_Temp": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}, "Umod2.0": {"values": {"Current_Power": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "Used_Energy": [6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6], "Current_Prio": [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], "Current_deltaPower": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "measured_Temp": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}, "Umod2.1": {"values": {"Current_Power": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "Used_Energy": [6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6], "Current_Prio": [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], "Current_deltaPower": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "measured_Temp": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}, "Umod2.2": {"values": {"Current_Power": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "Used_Energy": [6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6], "Current_Prio": [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], "Current_deltaPower": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "measured_Temp": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}, "Umod2.3": {"values": {"Current_Power": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "Used_Energy": [6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6], "Current_Prio": [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], "Current_deltaPower": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "measured_Temp": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}, "Usta2.0": {"values": {"Current_Power": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "Used_Energy": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4], "Current_Prio": [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], "Current_deltaPower": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "measured_Temp": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}, "shelly_Boiler": {"values": {"Current_Power": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "Used_Energy": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "Current_Prio": [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], "Current_deltaPower": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "measured_Temp": [20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56, 20.56]}}} \ No newline at end of file diff --git a/server/json_merger.py b/server/json_merger.py new file mode 100644 index 0000000..33a7e24 --- /dev/null +++ b/server/json_merger.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +""" +Created on Thu Apr 18 17:13:06 2024 + +@author: dh +""" +def merge_json(old_json, new_json): + if not isinstance(old_json, dict) or not isinstance(new_json, dict): + return old_json + + for key, value in new_json.items(): + if key not in old_json: + old_json[key] = value + elif isinstance(value, list): + if key not in old_json: + old_json[key] = [] + if key == "timestamps": + for item in value: + if item not in old_json[key]: + old_json[key].append(item) + else: + old_json[key].extend(value) + elif isinstance(value, dict): + old_json[key] = merge_json(old_json.get(key, {}), value) + else: + old_json[key] = value + + return old_json + +# Beispielaufruf +old_json = { + "timestamps": ["s", "e", "r"], + "data": {"foo": [1, 2, 4], "bar": [3, 4, 6]} +} + +new_json = { + "timestamps": ["r", "p"], + "data": {"foo": [4,5], "bar": [6,7]} +} + +merged_json = merge_json(old_json, new_json) +print(merged_json) \ No newline at end of file diff --git a/server/main.py b/server/main.py index 703b94d..9d2a708 100644 --- a/server/main.py +++ b/server/main.py @@ -1,56 +1,124 @@ -from flask import Flask, request, jsonify, abort +from flask import Flask, request, jsonify import os +import json +from datetime import datetime app = Flask(__name__) -TOKENS_FILE = "tokens.txt" -CONFIG_DIR = "configs" - +# Route to get configuration @app.route('/getconfig', methods=['POST']) def get_config(): - # Überprüfe, ob die erforderlichen Daten im Request vorhanden sind - if not request.json or 'token' not in request.json or 'data' not in request.json: - abort(400, 'Bad request. JSON data with "token" and "data" is required.') + try: + token_id = request.headers.get('ID') + + if not token_id: + return jsonify({'error': 'Token ID is missing'}), 400 - token = request.json['token'] - data = request.json['data'] + config_file = os.path.join('config', f'{token_id}.json') - # Überprüfe, ob der Token gültig ist - if not is_valid_token(token): - abort(401, 'Unauthorized. Invalid token.') + if not os.path.exists(config_file): + return jsonify({'error': 'Config not found for the specified token'}), 404 - # Speichere die Daten in einem Datei für das entsprechende Token - save_data(token, data) - - # Lade die Konfigurationsdatei für das Token - config = load_config(token) - - return jsonify(config) - -def is_valid_token(token): - # Überprüfe, ob der Token in der tokens.txt Datei vorhanden ist - with open(TOKENS_FILE, 'r') as file: - tokens = file.read().splitlines() - return token in tokens - -def save_data(token, data): - # Erstelle das Verzeichnis für die Konfigurationsdateien, falls es nicht existiert - if not os.path.exists(CONFIG_DIR): - os.makedirs(CONFIG_DIR) - - # Speichere die Daten in einer Datei für das entsprechende Token - with open(os.path.join(CONFIG_DIR, f'{token}.json'), 'w') as file: - file.write(jsonify(data)) - -def load_config(token): - config_file = os.path.join(CONFIG_DIR, f'{token}.json') - - # Lade die Konfigurationsdatei für das Token - if os.path.exists(config_file): with open(config_file, 'r') as file: - return json.load(file) + config = json.load(file) + + + data_file = os.path.join('config', f'{token_id}.json') + + with open(data_file, 'r') as file: + data = json.load(file) + # Extract and include last timestamp in the response + try: + config['last_timestamp'] = data['timestamps'][len(data['timestamps'])-1] + except: + config['last_timestamp']=0 + return jsonify(config), 200 + + except Exception as e: + return jsonify({'error': str(e)}), 500 + +# Route to set new data + + + +@app.route('/setdata', methods=['POST']) +def set_data(): + # Token-ID aus den Request-Headern extrahieren + token_id = request.headers.get('ID') + + # Neue Daten aus den Request-Headern laden + new_data = request.headers.get('JSON') + + try: + # Versuche, das JSON zu laden + new_data = json.loads(new_data) + except json.JSONDecodeError: + # Wenn das JSON nicht korrekt formatiert ist, schreibe das neue JSON in die Datei und beende die Funktion + write_json_file(token_id, new_data) + return 'Invalid JSON format. New JSON data has been written to the file and overwritten existing data.' + + # Pfad zum Datenordner und Datei für die Token-ID erstellen + data_folder = 'data' + file_path = os.path.join(data_folder, f'{token_id}.json') + + # Überprüfen, ob die Datei existiert und Daten enthält + if os.path.exists(file_path) and os.path.getsize(file_path) > 0: + # Bestehende Daten aus der Datei laden + with open(file_path, 'r') as file: + existing_data = json.load(file) + + # Merge der beiden JSON-Objekte + merged_data = merge_json(existing_data, new_data) else: - return {} + # Wenn die Datei nicht existiert oder leer ist, neue Daten verwenden + merged_data = new_data + + # Daten in die Datei schreiben + with open(file_path, 'w') as file: + json.dump(merged_data, file) + + return 'Data successfully set!' + +def write_json_file(token_id, new_data): + """ + Funktion zum Schreiben von JSON-Daten in eine Datei. + """ + # Pfad zum Datenordner und Datei für die Token-ID erstellen + data_folder = 'data' + file_path = os.path.join(data_folder, f'{token_id}.json') + + # Neue Daten in die Datei schreiben + with open(file_path, 'w') as file: + json.dump(new_data, file) + +def merge_json(old_json, new_json): + if not isinstance(old_json, dict) or not isinstance(new_json, dict): + return old_json + + for key, value in new_json.items(): + if key not in old_json: + old_json[key] = value + elif isinstance(value, list): + if key not in old_json: + old_json[key] = [] + if key == "timestamps": + for item in value: + if item not in old_json[key]: + old_json[key].append(item) + else: + old_json[key].extend(value) + elif isinstance(value, dict): + old_json[key] = merge_json(old_json.get(key, {}), value) + else: + old_json[key] = value + + return old_json + + + + + + if __name__ == '__main__': - app.run(debug=True) + app.run(debug=False)