From eecbb5d2678834f12fe1d58886ae242b59122d9f Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Fri, 20 Jun 2025 11:01:29 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=89=20Improved=20backend=20structure?= =?UTF-8?q?=20&=20optimizations=20=F0=9F=9B=A0=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/__pycache__/models.cpython-311.pyc | Bin 117534 -> 117446 bytes backend/backend/database/myp.db | Bin 126976 -> 90112 bytes .../__pycache__/admin_unified.cpython-311.pyc | Bin 229234 -> 229148 bytes .../__pycache__/api.cpython-311.pyc | Bin 36759 -> 48044 bytes .../__pycache__/auth.cpython-311.pyc | Bin 20559 -> 20473 bytes .../__pycache__/calendar.cpython-311.pyc | Bin 78969 -> 78883 bytes .../drucker_steuerung.cpython-311.pyc | Bin 17542 -> 17456 bytes .../energy_monitoring.cpython-311.pyc | Bin 24953 -> 24867 bytes .../__pycache__/guest.cpython-311.pyc | Bin 62438 -> 63935 bytes .../__pycache__/jobs.cpython-311.pyc | Bin 42596 -> 42664 bytes .../__pycache__/kiosk.cpython-311.pyc | Bin 10075 -> 10220 bytes .../__pycache__/legal_pages.cpython-311.pyc | Bin 3080 -> 2994 bytes .../__pycache__/printers.cpython-311.pyc | Bin 83477 -> 83391 bytes .../__pycache__/sessions.cpython-311.pyc | Bin 8807 -> 8721 bytes .../__pycache__/tapo_control.cpython-311.pyc | Bin 26711 -> 26625 bytes .../__pycache__/uploads.cpython-311.pyc | Bin 24107 -> 24021 bytes .../user_management.cpython-311.pyc | Bin 40018 -> 39932 bytes backend/logs/app/app.log | 174 ++++++++++++++++++ backend/logs/core_system/core_system.log | 2 + .../logs/data_management/data_management.log | 8 + .../drucker_steuerung/drucker_steuerung.log | 4 + .../energy_monitoring/energy_monitoring.log | 4 + .../hardware_integration.log | 12 ++ .../job_queue_system/job_queue_system.log | 15 ++ .../monitoring_analytics.log | 8 + backend/logs/permissions/permissions.log | 5 + backend/logs/scheduler/scheduler.log | 76 ++++++++ .../logs/security_suite/security_suite.log | 12 ++ backend/logs/startup/startup.log | 28 +++ .../utilities_collection.log | 20 ++ backend/logs/windows_fixes/windows_fixes.log | 2 + backend/models.py | 6 +- backend/requirements.txt | 2 - backend/server.pid | 1 + backend/templates/energy_dashboard.html | 4 +- .../data_management.cpython-311.pyc | Bin 19658 -> 19747 bytes .../drag_drop_system.cpython-311.pyc | Bin 60554 -> 60468 bytes .../hardware_integration.cpython-311.pyc | Bin 34150 -> 39932 bytes .../hardware_integration.cpython-313.pyc | Bin 33922 -> 34159 bytes .../__pycache__/job_scheduler.cpython-311.pyc | Bin 37019 -> 44346 bytes .../monitoring_analytics.cpython-311.pyc | Bin 17558 -> 17472 bytes .../__pycache__/permissions.cpython-311.pyc | Bin 10683 -> 10597 bytes .../security_suite.cpython-311.pyc | Bin 7443 -> 7357 bytes backend/utils/hardware_integration.py | 37 ++-- 44 files changed, 401 insertions(+), 19 deletions(-) create mode 100644 backend/server.pid diff --git a/backend/__pycache__/models.cpython-311.pyc b/backend/__pycache__/models.cpython-311.pyc index ae82ebc03b3a34fe3a2a9ffa44412f24de9024aa..ff1586e934c71438f0ea6eb2d9a0ba49f5fc5cc7 100644 GIT binary patch delta 126 zcmbO?js4hEcE07jyj%=G@K7-{<5E>4-&Q`x%KePB(>wMv1_+j=7L_OFl%$p@yf;gG1h MlRfhxJ4PT00PhDR0RR91 delta 215 zcmX>$m3`hccE07jyj%=Gp!6ps!?(JTZz~^T<$lJi(>wMv2GnOK=H)4*7L})FmZTPy zD3qrbrKINRD3s!Od0YxWP*ti>ng`TZ zTyl6%Nfk(6d1k6Ym7bHHLU5puV-8SHZlywSYH@L9ejdaO9fhFOl+0onhdH$*c{b%7 diff --git a/backend/backend/database/myp.db b/backend/backend/database/myp.db index fc74722bf241d4f19e4266ca103360214db593e3..971333f06b51e53019d6ec020d3d745c35cdee3a 100644 GIT binary patch delta 844 zcmZvaO>0v@6ozNwO`7kM)YxEClYmeu*kta#GxsBInzjfn!369=LTwvOVxwtlV?R(A zCN86k#9Jt?T=W;%yNE04A8@0%kwVYqJHcHf+^G(d#TdD?ZsuBwiGzOR2S~ zEH6Ayi*w0@n0~fA`SkYV+?_{LGi6CFZz^+l+2rQR^31)Wq-{m7rFar!EGE(jAu^+i zKm;~Uq;Y|S+lmqs_z0zfAYN3u3==aO>#NyZHkZ$A6xa2Ws40BeDA3~EMo@AexMy9T zT%*oyqnC>FQWY%P+M-|kdOvxyYt0jh@KQf(MifC+t6=Ux*@Yg6s8rz9eh^g^N)3qX zKz|pKV_hdB9hKz1kRq!J(MpSj^SX#kn9$!smIYp_f~jLMFyC7jQ&gGswUA`W~i&P z82B;R?Z#_iXd!6n-ihz9(*iuETkHS8*H$c`BlrWq;0Jtxeb9~n`vG=7M{(Tc-~u+= zYCc~qlydf6T=)1LZ;%z$koBeIfr+3RymBAAE3U&vqui`bV6)?6W69J!T)~5;CQjiK F_z&M%%IyFE literal 126976 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�ce3(;2T23yp-ha@@x;5v?4m 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 diff --git a/backend/blueprints/__pycache__/admin_unified.cpython-311.pyc b/backend/blueprints/__pycache__/admin_unified.cpython-311.pyc index ac517766a2ef5b449568c19186e59078c36d52a6..95b8fda8b68979814fddfd16c7b4a3d7a0974bc4 100644 GIT binary patch delta 70 zcmezLk9W>LUasZ5yj%=GaQx{;E@L_QU%~phc_sSE`k}?CMaB9dA^yJ3QI2}9zOIh? XE~#bBo8;Oz$uR;k)Amhr%m)$xYg`zD delta 166 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 A*Z=?k delta 239 zcmZ4UooV`fCcfpoyj%=G;4>>EBROLtp9GTv>qZSZR<;zTUANJBq-K_-7L_OFl$7SB>*u9blqBcmm!{|^=NF~w zr)B1(7V8_wJEaztro}s!7AIxqqyW{$m*%C!2PbEg=A`O-dU)$PCKV@VQmr2qf` delta 154 zcmex4pYi+xMy}<&yj%=GuuFa;SDRG**SSEpesWS~p1!j|u%T{pYEfQl4v=l+W2Enr zSdyAqmReMvm{U@km#&|eT2YdmlV6&mpPXNms-KpblUl5A9PgA`RGJp=SX!KvnUexk z7hjr}5+9tLQJRyg@9E*K>zGuWoRL#nTwG9ecuyM0pn#(Mtkmq1#G=hRr5sEF@9H<{ diff --git a/backend/blueprints/__pycache__/calendar.cpython-311.pyc b/backend/blueprints/__pycache__/calendar.cpython-311.pyc index 4b4e2839a6e04638751a57ce7616d280a8aa74ee..cacdb82dc538fc18f7ac15be856d27dc849587f3 100644 GIT binary patch delta 62 zcmezQf@Sdw7Ov&Iyj%=GaQx{;E^7|?Uw-R_ delta 158 zcmZ4dg5~E67Ov&Iyj%=GP+YW;%bKJ9>p~z~KRGEgPv6-f*ibh)wJ0w&2go+^G17NQ zEJ@8QOD!r-%qc0&OV`g!ttd&($uCXOPtGq&)lbXJNiEhlj(18eDou-bEGSGay|UWtCPerR!OQL%nVh`+CMl%t-judAcJ MOKREXSYAzY04S9blK=n! delta 154 zcmdnc!PwTx$hDl8mx}=iq)Ik&-Q%hMx(dkFPfp6r(|0xqHq=c{Ey_#H0kVyJjPzX+ zOHwn-Qj5wHb4p6{()IIFD@u}c@=H_nlkV;)9bjN^?^6Jw3d29g~WaGjd9ciwlYl?@0q06i}3(m6~0WShQJ?SKb@|e_l3W diff --git a/backend/blueprints/__pycache__/energy_monitoring.cpython-311.pyc b/backend/blueprints/__pycache__/energy_monitoring.cpython-311.pyc index 0c9737ef8f5d9c1265a4c46eb4e049f3e1ca5fe4..c0ae200a97a40cef89b65312e7f2b501b7e9ff48 100644 GIT binary patch delta 58 zcmex)h;i{DMy}<&yj%=GaQx{;uJ>H>zryu%^GfuS^+StOi;DF_Li~N5qa5{IeO(>( NT~f<7=W%m~0RUSu6N>-< delta 154 zcmZ2{i1FtkMy}<&yj%=GP?xun>pfTf*Hu8aesWS~p1!j|u%T{pYEfQl4v=l+W2Enr zSdyAqmReMvm{U@km#&|eT2YdmlV6&mpPXNms-KpblUl5A9PgA`RGJp=SX!KvnUexk z7hjr}5+9tLQJRyg@9E*K>zGuWoRL#nTwG9ecuyM0pn#(Mtkmq1#G=hg+>BuWI-EDR diff --git a/backend/blueprints/__pycache__/guest.cpython-311.pyc b/backend/blueprints/__pycache__/guest.cpython-311.pyc index 7cc9bb4628f8bda508e628b311e68f5db5f7573d..b5a8db408e745189f3abd2f760ac9bf0b6bbb799 100644 GIT binary patch delta 4273 zcmai13sf6b8lIaM0RkBakU#=gYI#U zZQb40tJQVu0X^ESb*-zZ+Q<5;t!1(9Nzzdw=b-lCYuDWkM?6~}UHASI!o%&^9l|&N z|KI<4@16V4eEx;}&2QwfzmJKDqR91%qOtYqcVCJlBl+7mXu(Xko@aK9tfEGguI zLM=cEfLqcBSO?IA2i*qzfy0RYi6DA{3Gd!>hiNv0%()qWLMf)pGjZD9f&wHt0g&8n zgVARQjH`OKNvTOwB?s|NfGIqTX7jlE0IYj|q!jVR4yc}O3Le!`WH?$&$_ijxFZ z3Gw*DM{A>JGfBcf?O|m?GHy7KP3C*&fx_t5Ksy66xQb64C`4w@-w&jyRVP7w3dans zL$Bkzh8ocY{PIvo{H!ZOc!%THf<6Dpa1-*xv6S-&v*Pbv~egttD!0g^> z2G&ntT;1L4;00S7Cs^>WPduh7he|Hsg(n*mrH!05ohBH(N5G$bN*vsuplYD{(XbL<%t(mhR9wU% z;_i7FzUSpMyico*koC)mJ1xFem}2789g?w-;F{|wl9)x|{bNZoR~)`C$AJI%jzSSh z^~>?#KoYjSY{a$8lH}AMqOrZs3{DFb{R$^D&xfX;;$jZU4w2b-p8SU{E_SP|S;lGM z4-W+rSH#SW(A$wACZh0=8YJ_=42!pzj0Q-WbXW@aEblY_4UaN%w#v5OhRW?^~*RTXF3=$f2zaN z99sQwI7Bs2Eakc}%u|$^5`Hs}vu7Hx<878lOEk-Eoo(h!w);x+=Vi+Nk4*QKrY!rvnW}b?r;B7v?z8z>%zcHJIhWvOy4qZf z(B0JIB&~p1#kY3yLKEL=cW|9Oj+VSW+P-aDXIrz~)z6>L%^|?))|b4NkUUe}P`7T;O44&23@^0WI|&gdR1gKBf;?_t z!LiX-gjbzo>X-#xZ4QnnIXRq6A+w2ZYi{Ko7K==ZE)>9d^&2oeN+2xV0)l-6)>)9$ zkopXjj;(^dg~tbPH{N1zYT-NiR)>q}sDZW~bdUy*)v5Fq%7O^v;u+=IPSLBRJk=Z|iglaIE(&ZX~CEuU&BQux9wj zbLIx7FL|D@ffu%uyrku{Fj5;Bk7#q+U%0B8|{2=EjE(kxQ2 zcB9fA3liylAmHC!j7wj?#|98dvix<^?m`e=$_wBDG?sYPhJZFbNGT!{o-Ood7x~y?ku5%6 z;AhLcY#H$yNWLwQoDo#YO|d~rZo>CoNx>smV%)irhT%;?*}@n@fXNwStbWG&ipj@R zh)l&8Q{`u>MykC`m5;eYWbPPaHv5^)KE@_8wtX=Hy_v*|GffyX0~sZO8?3~+If*zo zCry$F`Y8aCcCslLAvc+Vkt9@*ng^2<#Gjfk3?@(s8KN%x@J_F88Tm>6+mF|ZW%b^S z_RueoQzYh81Qsnlyfzr2fT#o}DFs9&5L83dNCkkw_Oxe`M6p=#M&5qYnStCdYjNaTe6Oz%z$q_csv8v>cR6Kp zW7ml6nm}4!Abn*}t7hVZ6oE-fZO}~t1WRU$nwivnEKznuj&s)RvJP0_69>hC97?alQ?_xPcEzd~~Zww|eQ;34K~1 zb?t<;RJ2xl)7L)f94`Ltz`=pX2i|hwf;-dQlst|^yACv^pG{m|MwpQ}U`EoSs`Hd13o7%gEy__nBFv~kLCi-@ zFg$8ef+SB4k^)8bl8DhIa*(qm24PAhrXs2)PyU{|(pY1WpJx$a&RdiEObz+Zl9QH4Gwu>RsriS;0r&RU2S`i!G-$HnSUY!lvg z(Ig{gA6+a$ERMUh$^;$Ak~`g&S?*LQ~DGDGBzznb$pah^4pc()ghyYV8Km?%!zwmV`8t}aL kb(PAz3L!d30Zz&(nNCFUaIZ%qstYQl!Fm}k`sT&|05-Ou3;+NC delta 3010 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 BcO?J- delta 1177 zcmXw1ZA@EL7(VBop3)X7P$+G=K*w6zaqk$?LV*bzmm(X}2r`&XAR281F~Q_Ibw6&w zPaHqYbSFcSDZy!&Mt)#!jEiB3xH1V2DXxn^A?T*@3$^^y#6;f%dUEe`p67Yr_uTi* zJ?}3H-(MH3m#kI`g0))I*_ZQ?)h`KO-@#h|#CH7DEj+SzPXqv+Jk8l4JH!XO{+48yCUE-hoi$6n~RV;8Fo)e_glJ~r#|;C%L3 zu#{a1dBMLGQb2pF%diOjc{1-k<>IxwOB12ny=<~N3el|^Ib9qSk0a`d9AobA6NUn)WN(C>Y$9x6AB1hTPrw+1_i53L(DNu&)T1wkBLw&Afg^qR zanb5Z3HjNsZ%gHPu5ZO#mO=)56W+x!(}q|w(f6@oS*%KkRVhSVP581jZ;BsmgJ;EG zK5a?(?;1P0;r30Oo^~v|YZLC;6vBm&);BW{Z;Qka@kh^Y*&;&}&3YAgH$_(sn4?j# zHMvmC$wkbS-Hb_0QZnwYBXc1PVy@Z%fw?*g{2Eqd5MPuj^k@*x2YAVR&~nT{=IfQr zV>Ysofk7--dC7u}a_*=F{$+MC$Dk5CITS#PenmJLKwn7;YL(HFgh4FHmNuCzRqb!{ zk$5o$C+?%*#APGrfyUAf6S`3#118dVLBeF|G?Ii(>ck{b#|v&^3eHVqlMG@tVCfdf zYMs!fS;N~+)>Gi?0s+2GEj>Q6o~dN?6q5}R zgV-phfNP|!vxDKWJiYxscN)IJ)XvLv7XE9qUVdWSYMcYAUSl^Nd*FY1XQYEJf_qjU ziCj11n0{iQ7t?RRN$8(HRYq})rB3~2Tm$1DtpD-M!)Z9gTBF@~S)Yn}Fx`Yep`I8_ zGvOJwK0FEeFTJ{gzhm8JUIg4c(@cMalonkY=`k8(K-C%c+Sw%i73dIa7(K23@Vag= z{=6F*KVJeT#Ll{sfj&hTY(UlwEjtkKX*=qr$(tKU*;X diff --git a/backend/blueprints/__pycache__/kiosk.cpython-311.pyc b/backend/blueprints/__pycache__/kiosk.cpython-311.pyc index adbeca00d78178bf9c812ecc651c85caa1244e89..7c0d0a0b5625b1a2c76dfb442ddbce724ae8699b 100644 GIT binary patch delta 954 zcmZuvOH30%7@pasP}=e?V$znjyemSBvD6q53zUPVg$P6*2P~bTJlZbK?usA?H#OnV zxW;(!Ks3SlI6$~~m6P5IX(CzE=!FA`F;!z?h%wHz5@PhvKi~fOzJI=%{deC7KJ^qn zEhx|d8s_|g33KH};a;Bg;F2>Mlbj*vfQX6c?C0Ck_;v-y?Ujz_HTIQ3DDa~Ppa;7;}lVT1mfG|Ls#}MVd%v+=Ei;Tk5MHnk$I?|&2 zF!w)w0TTTJoXTb0ED$%%gECqWvs9R2GO(&uAS`PGNVf**0d!>p0tEUps~Sk9hb#a! zfVdaAe;qUc>7{bTWoW)IM7J$+x45hUt7hRWxWNyBS?DkX_Ss7i1`eo}iNSF^D#~Ls zL`5GEng>;9Xv>d1<*V(A={UXb1FzZJ3SPJBI^6sgIMLzaw_KVI zw=!uztG`P1%v|P8$_J}Sd20{Du+mcHDHW*lgf8(m{gswM+EAy=S8bFU^8GLkj_|vA zv#t6OtU$C?)g66*GR2&O%6?6|nOQvp-zb92U=OtCq5_g5_&izI?5h0?9gVP?x-$I2 S1J0d delta 806 zcmZusK}-`t6rI`KLTP{?EKwT3($YYUxQG&r7i1NJ%Ayex!o{ZD8QQ|Si!-y95D`47 z2?u0}@nDS6L{0QUxES<;9`sleysYVwgNd3NCGqGiO(8K({=9kf=D+{{e7p2zxcWs^ zRRHkS^nDI9eqivrwyCZY4YLS zgjeV?u_o~pOOUlj|L=Nu$~n-i%rnWGt+*z|5<|k2;BgXU6(tRTNneSl01}@+} zQ?5j9WVvMoCoPLP{!nNz;7TlW4ZA*SU_9*#7A5^&xd643)5Ov-rLIV9leBS_c%LDM zJ&19LL2{HI6moEuL;dM>P8LAEvS#tZ()D}VqIOp+2xV0o%-7Yg^gKk%y-U4$xp`$c z7dcamPf||SHf3!~);KA~wwLi_;N@U0(*0&MC###Xx+SZe6ys0cx!p1rYU0fvwD$$U z1~}wlFrYSw8?8rFS$r@1)CT8Q%V~JkITl`o$ax#?sWrIa8Q=5{A9w*2D#MNxS*`U~ zXs`hGaYtVJ7*d)%ioR^o20SGRy-N<#HN&Z)$er{fgezJaOacWVqen^PFuXB{6o~y5`qrOXO K+2%OrRU82AR}sMg delta 152 zcmdla-XX!YoR^o20SIbkHger(s{gtK$ktCz%FNSuHV8JB) x^HSo2lQT+lQuRGOymcLuijy;PN{fpNiVp8d0~r)hl%JKFU6NR|S%`T72LSifHO2q{ diff --git a/backend/blueprints/__pycache__/printers.cpython-311.pyc b/backend/blueprints/__pycache__/printers.cpython-311.pyc index bed59131a3287ecf4b38dc10be42749371cd4cad..464f1c52e62b90a9d1fdc669ee88d389cbc37819 100644 GIT binary patch delta 63 zcmbQ*!@9qlm3uiaFBbz46!U~`g(#L R?~+>9d|!I|eQ8EBEdWqq6M_H$ delta 159 zcmdnr%{sM*m3uiaFBbz4lBFe2ny6 z5=&Au%TkNV6LU&R^V0S6QY%W5bMi}5^po?8QuWg^b5e`-jpLnCi%Qet9ZQRoGILUZ z>f%fDQsRS?GfHz(^*uejbsdw6lQVKki;D}24(~|=85B^IpOuu&k(Y;E{+FMAZeEFgvVLfBYEiL%NQl3$bCjc=tFNo0 NzDsJ^=05hDQUD*B64?L% delta 155 zcmbQ}^4x`YIWI340}$vNhh(s9V;)9bjN^?^6Jw3d29g~WaGjd9ciwlYl?@0q06i}3(m6~0WShU%R{k#+aI>|PW diff --git a/backend/blueprints/__pycache__/tapo_control.cpython-311.pyc b/backend/blueprints/__pycache__/tapo_control.cpython-311.pyc index b75935b8c63f05fa51b9ad9751462eb584d0f739..805ebfeb37a192a8d523b13b0285bd2ffe69a68f 100644 GIT binary patch delta 58 zcmcb9fwA!dBiC|XUM>b8IR11a*FFLHUqSl0c_sSE`k}?CMaB9dA^yJ3QI2}9zOIh? ME~#akZ3U&m0ZMEW7ytkO delta 154 zcmZp?zb8U@Y0lwNIe_>rxzGuWoRL#nTwG9ecuyM0pn#(Mtkmq1#G=i`97&-7qeeGJ diff --git a/backend/blueprints/__pycache__/user_management.cpython-311.pyc b/backend/blueprints/__pycache__/user_management.cpython-311.pyc index 2cf5b2d5cc766640753aba55e1c03797d6e79989..2cf56f0d8a5c5248ccfb1f6f0ffc8f3bb76a9b8a 100644 GIT binary patch delta 58 zcmcb#gXzz9Ca&eYyj%=Ga5a1*mldDk1%SKRGEgPv6-f*ibh)wJ0w&2go+^G17NQ zEJ@8QOD!r-%qc0&OV`g!ttd&($uCXOPtGq&)lbXJNiEhlj(18eDou-bEG -
${device.current_power || '0.0'} W
+
${device.current_power ? device.current_power.toFixed(1) : '0.0'} W
Momentan
-
${device.daily_consumption || '0.0'} kWh
+
${device.today_energy ? device.today_energy.toFixed(1) : '0.0'} kWh
Heute
diff --git a/backend/utils/__pycache__/data_management.cpython-311.pyc b/backend/utils/__pycache__/data_management.cpython-311.pyc index 028510c1c6d6c7bd00800766a4c79f55270046a2..d15c8d95541729d0a8363dcf7c28fa749b25be49 100644 GIT binary patch delta 2018 zcmZuxdrVVT96qP*y?p=`!Ggd_OBKemtrZbLl+uDO4m1H=WK)K{6%g9Oxwo>%t!`Pe z8M6n;$tFH$W^_7VkY0zt{)bF_+nB05@H);4FrdtB|ac)q+;gozx#y zBXk0u#1+xV8d5B4wyI_#0`5^bu}C~Zv?DiHB^c;0`I$M|W(3JvNakjegIGw4a1u|) zTzTqbnWJ~|O<5_;XaSOpGdTz?M5HjnPiGlr9745zd3>9A$C4Ybn z!i;eP@xydMUr6wiDi+Xm2e*XcyeL6{kZK5#WdKE5@+{-;Fi=LSeE}iP6TcYlmEw9x z4w3eN*h%UjL(~FT6Bj82PX8)#ne`Z{CXRQ4}*39!no> z`OXzHHC;C~O_-W?HcZYjO(8zTJXA1|U2?4dMz%AS?W7_MnJilzd!})yVSnRLV{BRD zp#JC7oLi}RH&XLrHqWRY0PgFl-icIiEY(XtFKyLo-Am9|QXw5Fw9(Tm^qc;G@7j%? zG*%~A>k}MN%W5y$xIdzi9{K>Gtq(0FYmUO$6YwN1^0urIG}ER^XV#ST)LoFB0nX%t z4iNciF-_oSBo#=RAZe$ixq>z!xjI2o{LBeDL4VRP%g?;b6T8emvZ#RRYI{jhlB|Jx zNM==WVAcm>1T~{;M(-Yw(IFkZv!sAtu%}}!y=h;dPLZ`Ub~Q${+qJ?Ru&ctJu&dos zYEbM-K45>g&0#Sg1QO>Y(jj({kAagz04;Y}krPTSB@TMYk?$ZMvA$v+UhHCqjB^8B z-M%hT!GzrmmE8YDN>Q2pdrHvuAGG| zNo0q&)tXo?6P1k4=-K)l%uPbShu&%!D;NP*R7hTD2@VF#C*&=FxZ%->PtUHBb|`yx zk;%#n&odTbpi~OmJi>O1uq`5NO9)#&VM`=zNknF_jlp{il#iNZjMdhxKlDJiJP;DX lz5W&CcTiyu>1V6|c5cOZ=@fc8-c#cDA6H+BUVH8z)&HOA7!3db delta 1822 zcmZuxeN0nV6o0qx11M6e2pwQUDWa`F9}0uXhtd|Y6SI(j&Lt|Az6UMVmfiQ>a9hDG zTQ-wvVsd59uc>oU8Ek&kZ5T}i$<(BM=hZ<*m!hd@>HnLGV|s zUm-SnRXOmQjC;L7RSR{AA$h0j3x+jG^o6l3b_Rm7B387!WUO_zJ2j;v5R@RVT?BqZr1Hi8Z_ z5_gpCV*7L|Fv-#V#E0 z3D*>6q(PdHOrvC;q;F-47}byrGR$HI+xob~0yaIuL7FLlULV)b(OfC+^`c&8C;JN1 zi|iR>#x9bQWuN5@>S6|;w@1~m+#c4{9!-sLDpU>Y$PH1{)mTV%N%dyEqILA(uuoQ$ z7>l(~Opj$)67q#58P~vT#JE7HGmLAgD<~>NF(aMQz&t$e|I@`0mX(ls!I@5C8 zIh9#Fky%XkmKGJ4yANXE`%A&q}de z@3OLEHD;HYy=LZJR`ODrDd&&5hIT@a*|Bw^Q@?lbAeSiS<+qxCsYgXxuw#APLTde8~QtXx-vtz-~=Su+5g@g z50dLuH7K2+>M?MY0_ zeYsALR$YKRyMTAnHLp{6gTk8>>=Z6j=%>(3!A9Y15*CqT_08xk`Mv%Qe+_~SduwWZ8B24j4R~@ae|}4+1Fko?0x4(^4{?Aw|=g@)7?t z%>Bf^cC6rY@a(oku|%3hg@WIqK*ddr9<@GRt5F(?Kj{kf`Y6Qj04*A(Rl>A1m{tJO y(_(rse4C7UveM(vrw;|y{pvBJyX3LwQF#|a)w9h1b82rcp4$Q{Hc|0_^GH?KrLSwFNmwWwG>B*fp>Im%Jb)z{Tg N-zBwd^Ch+&PXQ&L6S@EZ delta 155 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 delta 6177 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 D{sYB@ diff --git a/backend/utils/__pycache__/hardware_integration.cpython-313.pyc b/backend/utils/__pycache__/hardware_integration.cpython-313.pyc index 9a4fa9489dbd7bd21b9657810e524dc7e878ac23..14043fa6f46efd3990b1e6ea635659f68c5869a1 100644 GIT binary patch delta 4308 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 diff --git a/backend/utils/__pycache__/monitoring_analytics.cpython-311.pyc b/backend/utils/__pycache__/monitoring_analytics.cpython-311.pyc index 729edc3844ff874a59b105a642e7d1387990af7d..5061249105ccdd0b74dd07f0bcacf906f886bdcf 100644 GIT binary patch delta 62 zcmbQ%$#|fHk#9LKFBbz4oX+sfVAtQsr_3h*D^x!>uS7ptKeRZts8~NF#NXFB%2ChN Q*VR$qCADnxGPV!406VJ_bpQYW delta 158 zcmX@m!8omxk#9LKFBbz4Tom-q*rL0UPnoU$>k1%WKRGEgPv6-f*ibh)wJ0w&2go+^ zG17NQEJ@8QOD!r-%qc0&OV`g!ttd&($uCXOPtGq&)lbXJNiEhlj(18eDou-bEGn;?$yI{g4oUU*{-CJy%~> OM}3#nvdt}Q=E?w6785rB delta 156 zcmaDFv^$t@IWI340}!l{@z40Hu#u0Et^VtLAYVT@DKk&s*&x_ZH#xN^FEt0qHu5pj zcS$Ts%`8hTDo@NQDa}jQ&r7W+NzTbHP0>%zFG|%<%gjkF);ErKN-Zi)i+3z7PRh(l z0ji5H%}a?7PR=OJN!9oC@YZ!qDo)PGDJ?E8C_20+4P;P2QGQlxc1dEm22%=j!X~ OsPB?mws|9Kk~jba6%pb9 delta 156 zcmdmMIoXPDIWI340}xyk^v<}=zmZRmwf^fOAYVT@DKk&s*&x_ZH#xN^FEt0qHu5pj zcS$Ts%`8hTDo@NQDa}jQ&r7W+NzTbHP0>%zFG|%<%gjkF);ErKN-Zi)i+3z7PRh(l z0ji5H%}a?7PR=OJN!9oC@YZ!qDo)PGDJ?E8C_20+4P;P2QGQlxc1dE<=2X@QaRBTC BH+ld7 diff --git a/backend/utils/hardware_integration.py b/backend/utils/hardware_integration.py index 8a05631c6..4c3f5fb15 100644 --- a/backend/utils/hardware_integration.py +++ b/backend/utils/hardware_integration.py @@ -13,6 +13,7 @@ Autor: Till Tomczak - Mercedes-Benz TBA Marienfelde Datum: 2025-06-19 (Komplett-Neuschreibung für Backend-Kontrolle) """ +import os import time import socket import threading @@ -30,10 +31,12 @@ except ImportError: PyP110 = None TAPO_AVAILABLE = False +# Entwicklungsumgebung-Erkennung +DEVELOPMENT_MODE = os.getenv('MYP_ENV', 'development') == 'development' or 'WSL' in os.uname().release + # MYP Models & Utils from models import get_db_session, Printer, PlugStatusLog from utils.logging_config import get_logger -import os # Logger hardware_logger = get_logger("hardware_integration") @@ -71,6 +74,9 @@ class DruckerSteuerung: if not TAPO_AVAILABLE: hardware_logger.warning("⚠️ PyP100 nicht verfügbar - Simulation-Modus aktiv") + + if DEVELOPMENT_MODE: + hardware_logger.info("🚧 Entwicklungsumgebung erkannt - Erweiterte Simulation aktiviert") # ===== KERN-STEUERUNGS-FUNKTIONEN ===== @@ -350,9 +356,9 @@ class DruckerSteuerung: def _steckdose_schalten(self, ip: str, einschalten: bool) -> bool: """Schaltet eine Tapo-Steckdose ein oder aus""" - if not TAPO_AVAILABLE: - hardware_logger.warning(f"⚠️ Simulation: Steckdose {ip} würde {'eingeschaltet' if einschalten else 'ausgeschaltet'}") - return True # Simulation immer erfolgreich + if not TAPO_AVAILABLE or DEVELOPMENT_MODE: + hardware_logger.info(f"🔄 {'DEVELOPMENT' if DEVELOPMENT_MODE else 'SIMULATION'}: Steckdose {ip} würde {'eingeschaltet' if einschalten else 'ausgeschaltet'}") + return True # Simulation/Development immer erfolgreich # Zuerst Netzwerk-Erreichbarkeit prüfen if not self._erweiterte_netzwerk_prüfung(ip): @@ -409,6 +415,11 @@ class DruckerSteuerung: if not drucker.plug_ip: return 'unknown' + # Development-Modus: Simuliere wechselnden Status für Demo + if DEVELOPMENT_MODE: + import random + return random.choice(['online', 'offline']) + # Ping-Test zur Steckdose if self._ping_test(drucker.plug_ip): return 'online' @@ -514,9 +525,13 @@ class DruckerSteuerung: """ hardware_logger.debug(f"🔍 Prüfe Steckdosen-Status: {ip}" + (f" (Drucker ID: {printer_id})" if printer_id else "")) - if not TAPO_AVAILABLE: - # Legacy-Format: (reachable, status) - return (True, 'online') + if not TAPO_AVAILABLE or DEVELOPMENT_MODE: + # Development/Simulation: Zufälligen Status für Demo + import random + if DEVELOPMENT_MODE: + return (True, random.choice(['on', 'off'])) + else: + return (True, 'online') # Zuerst Netzwerk-Erreichbarkeit prüfen if not self._erweiterte_netzwerk_prüfung(ip): @@ -720,8 +735,8 @@ class DruckerSteuerung: """ hardware_logger.debug(f"🔴 Schalte Steckdose aus: {ip}" + (f" (Drucker ID: {printer_id})" if printer_id else "")) - if not TAPO_AVAILABLE: - hardware_logger.info(f"🔄 SIMULATION: Steckdose {ip} ausgeschaltet") + if not TAPO_AVAILABLE or DEVELOPMENT_MODE: + hardware_logger.info(f"🔄 {'DEVELOPMENT' if DEVELOPMENT_MODE else 'SIMULATION'}: Steckdose {ip} ausgeschaltet") return True try: @@ -763,8 +778,8 @@ class DruckerSteuerung: """ hardware_logger.debug(f"🟢 Schalte Steckdose ein: {ip}" + (f" (Drucker ID: {printer_id})" if printer_id else "")) - if not TAPO_AVAILABLE: - hardware_logger.info(f"🔄 SIMULATION: Steckdose {ip} eingeschaltet") + if not TAPO_AVAILABLE or DEVELOPMENT_MODE: + hardware_logger.info(f"🔄 {'DEVELOPMENT' if DEVELOPMENT_MODE else 'SIMULATION'}: Steckdose {ip} eingeschaltet") return True try: