From a41ef9e75ac8ed3f218bd19490a21cf6f4936a5a Mon Sep 17 00:00:00 2001 From: tugsi Date: Fri, 14 Mar 2025 17:42:26 +0100 Subject: [PATCH] =?UTF-8?q?docs:=20update=20changelog=20and=20header=20for?= =?UTF-8?q?=20version=20v1.4.1=20-=20Die=20MQTT-Puffergr=C3=B6=C3=9Fe=20au?= =?UTF-8?q?f=2016.384=20Byte=20(16=20KB)=20erh=C3=B6ht.=20Dies=20sollte=20?= =?UTF-8?q?ausreichen,=20um=20Ihre=2015.403=20Byte=20gro=C3=9Fe=20JSON-Nut?= =?UTF-8?q?zlast=20mit=20etwas=20mehr=20Spielraum=20zu=20verarbeiten.=20Di?= =?UTF-8?q?ese=20=C3=84nderung=20erm=C3=B6glicht=20es=20dem=20MQTT-Client,?= =?UTF-8?q?=20gr=C3=B6=C3=9Fere=20JSON-Nachrichten=20ohne=20K=C3=BCrzung?= =?UTF-8?q?=20zu=20empfangen=20und=20zu=20verarbeiten.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Einige wichtige Hinweise zu dieser Änderung: Die neue Puffergröße von 16 KB verbraucht mehr RAM, der ESP32 sollte jedoch ausreichend Speicher dafür haben. Die Größe ist auf 16 KB festgelegt, um über die benötigten 15.403 Byte hinaus zusätzlichen Puffer-Overhead bereitzustellen. Diese Änderung betrifft nur den MQTT-Empfangspuffer -- - Die Task-Stack-Größe von 8192 auf 16384 Wörter erhöht, um mehr Speicher für die JSON-Verarbeitung bereitzustellen --- - Erhöhung des Keepalive-Intervalls auf 60 Sekunden - Verbesserte Fehlerbehandlung und Debugging-Ausgaben - Detaillierte Statusmeldungen für die MQTT-Verbindung - Periodische Verbindungsüberprüfung alle 30 Sekunden - Bessere Handhabung von Verbindungsverlusten --- - Verwendung einer eindeutigen Client-ID mit Zufallssuffix - Erhöhung der QoS (Quality of Service) auf 1 für zuverlässigere Übertragung - Einstellung eines Socket-Timeouts von 60 Sekunden - Aktivierung von Clean Session und Will Message - Verbessertes Verbindungs-Logging --- .gitignore | 5 ++ .vscode/extensions.json | 10 +++ data/bambu_filaments.json | 70 ++++++++++++++++ data/favicon.ico | Bin 0 -> 16958 bytes data/header.html.gz | Bin 0 -> 689 bytes data/index.html.gz | Bin 0 -> 1167 bytes data/logo.png.gz | Bin 0 -> 8198 bytes data/own_filaments.json | 31 +++++++ data/rfid.html.gz | Bin 0 -> 1707 bytes data/rfid.js.gz | Bin 0 -> 5860 bytes data/set_spoolman.png.gz | Bin 0 -> 8932 bytes data/spool_in.png.gz | Bin 0 -> 21835 bytes data/spoolman.html | 171 ++++++++++++++++++++++++++++++++++++++ data/spoolman.js.gz | Bin 0 -> 2821 bytes data/style.css.gz | Bin 0 -> 4898 bytes data/upgrade.html.gz | Bin 0 -> 2583 bytes data/waage.html.gz | Bin 0 -> 1658 bytes data/wifi.html.gz | Bin 0 -> 857 bytes src/bambu.cpp | 83 ++++++++++++++---- 19 files changed, 356 insertions(+), 14 deletions(-) create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 data/bambu_filaments.json create mode 100644 data/favicon.ico create mode 100644 data/header.html.gz create mode 100644 data/index.html.gz create mode 100644 data/logo.png.gz create mode 100644 data/own_filaments.json create mode 100644 data/rfid.html.gz create mode 100644 data/rfid.js.gz create mode 100644 data/set_spoolman.png.gz create mode 100644 data/spool_in.png.gz create mode 100644 data/spoolman.html create mode 100644 data/spoolman.js.gz create mode 100644 data/style.css.gz create mode 100644 data/upgrade.html.gz create mode 100644 data/waage.html.gz create mode 100644 data/wifi.html.gz diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..89cc49c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..080e70d --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,10 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ], + "unwantedRecommendations": [ + "ms-vscode.cpptools-extension-pack" + ] +} diff --git a/data/bambu_filaments.json b/data/bambu_filaments.json new file mode 100644 index 0000000..afe2bc7 --- /dev/null +++ b/data/bambu_filaments.json @@ -0,0 +1,70 @@ +{ + "GFU99": "TPU", + "GFN99": "PA", + "GFN98": "PA-CF", + "GFL99": "PLA", + "GFL96": "PLA Silk", + "GFL98": "PLA-CF", + "GFL95": "PLA High Speed", + "GFG99": "PETG", + "GFG98": "PETG-CF", + "GFG97": "PCTG", + "GFB99": "ABS", + "GFC99": "PC", + "GFB98": "ASA", + "GFS99": "PVA", + "GFS98": "HIPS", + "GFT98": "PPS-CF", + "GFT97": "PPS", + "GFN97": "PPA-CF", + "GFN96": "PPA-GF", + "GFP99": "PE", + "GFP98": "PE-CF", + "GFP97": "PP", + "GFP96": "PP-CF", + "GFP95": "PP-GF", + "GFR99": "EVA", + "GFR98": "PHA", + "GFS97": "BVOH", + "GFA01": "Bambu PLA Matte", + "GFA00": "Bambu PLA Basic", + "GFA09": "Bambu PLA Tough", + "GFA07": "Bambu PLA Marble", + "GFA08": "Bambu PLA Sparkle", + "GFA02": "Bambu PLA Metal", + "GFA05": "Bambu PLA Silk", + "GFS00": "Bambu Support W", + "GFL03": "eSUN PLA+", + "GFL01": "PolyTerra PLA", + "GFL00": "PolyLite PLA", + "GFA50": "Bambu PLA-CF", + "GFS02": "Bambu Support For PLA", + "GFA11": "Bambu PLA Aero", + "GFL04": "Overture PLA", + "GFL05": "Overture Matte PLA", + "GFA12": "Bambu PLA Glow", + "GFA13": "Bambu PLA Dynamic", + "GFA15": "Bambu PLA Galaxy", + "GFS05": "Bambu Support For PLA/PETG", + "GFU01": "Bambu TPU 95A", + "GFU00": "Bambu TPU 95A HF", + "GFG00": "Bambu PETG Basic", + "GFT01": "Bambu PET-CF", + "GFG50": "Bambu PETG-CF", + "GFG60": "PolyLite PETG", + "GFG01": "Bambu PETG Translucent", + "GFB00": "Bambu ABS", + "GFB60": "PolyLite ABS", + "GFB50": "Bambu ABS-GF", + "GFC00": "Bambu PC", + "GFB01": "Bambu ASA", + "GFB61": "PolyLite ASA", + "GFB02": "Bambu ASA-Aero", + "GFS04": "Bambu PVA", + "GFS01": "Bambu Support G", + "GFN03": "Bambu PA-CF", + "GFN04": "Bambu PAHT-CF", + "GFS03": "Bambu Support For PA/PET", + "GFN05": "Bambu PA6-CF", + "GFN08": "Bambu PA6-GF" +} \ No newline at end of file diff --git a/data/favicon.ico b/data/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..14b75860356963e6670a033b5cf907de68e862b9 GIT binary patch literal 16958 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 literal 0 HcmV?d00001 diff --git a/data/index.html.gz b/data/index.html.gz new file mode 100644 index 0000000000000000000000000000000000000000..c1814488e044aa06cb860629d8e6554c281d454f GIT binary patch literal 1167 zcmV;A1aSKwiwFpmSkz|%|7mVyWq2-VbZu+^tyf!b+cp$_&#ySuiybVImSjVRL^9Ck zG8EX_0Zvi$X*iZ>i3>$)BxTnd`rmg*Nsi>(HlTWlMe-xhcfNC>lDrB-C>iDuhO^|= z{fE1!&%ZrDX)7^1OWY3#ltmga8Mp~T&dz|Iq+%8!D^VL})8OONWB5}rT#{I^G+1%A zu9da{WJ+2l3A*OFEz_K>c*a6MxBxD>s{yrh`+? z514Y#01{dD#oo0sC8Lwo1ik}Dv^TSFyD=xI_;R&N;_YjXNuJJ6Vu6qpZEH5 zS@cA1CKuoV=bcYU+=nEI+gwc+D&KVB%J~X1fyShP#MJ_I@De(|=mVSvIXAVy%?&IC z`*I5?cp*b>S!He@BY&B`g#zmvxYDe;9US5h;#C1gXOvz-6)N)ihJq5m&*EQbI_QZw z%_h;#>aX?7^q!vJ^CTv2D@c^WL7llL_0 zBmVYO?7pGlUhtvq`Tw!4u?pKm+XHDlZ-=wv8P~m@CBwVxY_G(-3ujp4gMt~=L{gt9 zg?fbhtQrlbqI?DFPmQHQgC(`5#8|Clap)Wprd^|J4zBN^)?8ZZVv#?4!0xKeLwMnM zHL^XDvF|3_0D>i^kTXM#isdu{!>d~G{+0V>Er8FbS9TI(< z(C(91uh)@xlCCtY>wU{dfS!oc>6BX(pN5G~uV2TH?at%JpW5YY?Iz10(U*)WhCU-s zG?xx?@DjOh#f5im^eLE5EK0uX1L%78fQD1Bx4E*DA{hg|6@?gOQx0|E%KPmleTAnXkscbdNR3Z6a%;zI!man$H8KAuP hmtfm==+od|z1VNHN!)%#5jFph!9S68^8z*u005R^ME(E( literal 0 HcmV?d00001 diff --git a/data/logo.png.gz b/data/logo.png.gz new file mode 100644 index 0000000000000000000000000000000000000000..9681c15346c83ec203a508a5432f9558346a67d5 GIT binary patch literal 8198 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 literal 0 HcmV?d00001 diff --git a/data/own_filaments.json b/data/own_filaments.json new file mode 100644 index 0000000..cd3e43c --- /dev/null +++ b/data/own_filaments.json @@ -0,0 +1,31 @@ +{ + "TPU": "GFU99", + "PA": "GFN99", + "PA-CF": "GFN98", + "PLA": "GFL99", + "PLA Silk": "GFL96", + "PLA-CF": "GFL98", + "PLA High Speed": "GFL95", + "PETG": "GFG99", + "PETG-CF": "GFG98", + "PCTG": "GFG97", + "ABS": "GFB99", + "ABS+HS": "GFB99", + "PC": "GFC99", + "PC/ABS": "GFC99", + "ASA": "GFB98", + "PVA": "GFS99", + "HIPS": "GFS98", + "PPS-CF": "GFT98", + "PPS": "GFT97", + "PPA-CF": "GFN97", + "PPA-GF": "GFN96", + "PE": "GFP99", + "PE-CF": "GFP98", + "PP": "GFP97", + "PP-CF": "GFP96", + "PP-GF": "GFP95", + "EVA": "GFR99", + "PHA": "GFR98", + "BVOH": "GFS97" +} \ No newline at end of file diff --git a/data/rfid.html.gz b/data/rfid.html.gz new file mode 100644 index 0000000000000000000000000000000000000000..4c86b2b9c7b48a4bf94f9059734caab4ad47bd23 GIT binary patch literal 1707 zcmV;c22}YUiwFpmSkz|%|8iz&WG-lQZEOI=S>0~iHWa?kQ*gR*f>n0Y?qWz}18vd* z0g|Su(*?VvB}!sTks3+a@rJ&}o~CzulRe1}Nzs;VNp_lU6OdXW4-e1JcYer5KZGI5 z2~JQLPNE+!Z!hkCeg6jKx?q!|$owFNc{UCR56l2iPL2>fQ9(3DagL=TdK`SbdmH{7 zG^aQ&$T*l&vM7br0g46JgahegdOeD+NT?w6|m|>;H0mt(h zmciO}cG5a{93)hg3@^`6%E-ex!i;7-q?#1!48@=?k>@DGKT|*@z2y!jc#A?`PK*ym6Rw)7XB?)KZ zq0PHnIG{??ScS%@J78TWju$3iYg$MZFFNREmDXT8>sOLOoy&b#uCiY}9y-#F4c8v| z;K-5Z<4xbXV&s^%D7}lx9$U0pcx{W9F4q`4yzCKw18_iZVHtGf%uf|;oi4)~KI@{> zR*8Cy)*8Qnwi#i;L<^1CS)T>FSKXu#+hK10{Xc%3a#z_&JeD&INyo*M`^R5 zI)@lScQ|{xPS!)}-mwIZ`xWbgRGp~~gjyzP(gn0{0H+7&Ei?qC58ngPinVOO;CCOw z80{zMbsTgaRf=PiqvS!JI}DM(5S|EmC?rSwRCt<>_k?D-ezJBGH?h*uv2C<@|G%c! zgl7=Z-&<41_B(1CjVjhvHae5gQ)2K2L#~DsuKMO6wALs*o9hGO(linGR3<1{!eN}M zI7c&*{`HkHz0prR**I-YUVqXxzxeoJ+Clt<{LI&H- zI+Zaa-I?Qn_Q444du3PJTdP}pi@Vtc-cYR>k^g!lXqvjZt3s=erp20(jdYX>X%3nu z$+{bcolI`&I?Qxn+XMEGL13a6gz!goKasLRS&wf>x%M?kkc6t1y*m~}X%7H4FO7p> z@}3c_2#Rwd6tUgEqv#44w?oIQvt@0K0?UlTVSuEd`swrXp|7=zC@-PiaTi;0PU6qT zuU22d*|P3kro~kPDw}DNAi?7t^9&YLWde!BpZ+hUC=;>Z$0t1--U8Pe7|1tU(;IYk z*`arr`#Ymx7q~{5w3cz|4q`zInm3PjyY_XsMx)i;;T~}MfC4m%B1~%I9MG3}Qh%B; z24^(>Y>HTxvB%kaqu5vs0bC)-O}?@{>gL$K=6Rg}R|~yq+c3SS+ijNZmDX5Fu?QxA z|M|85Sawi-U2*kC=nXW4JJUVFnk;&2W0Y{TAQG_BsE9e`zgL+li&=M7JiPAN;nG){ zE1s@z`qo9kc<#*EldQB;>hwY5cl|Qq5zgIfB2iloZm%(nEiZG`|k2p@G-E`9!uf zww;C#DL@}coa_Ih{Mf5H^y+5XQFwexz=gWR8eeqWskLohFA19K!8n*|Q^?Gop&7E! z|Hcky_kL=1P35kn-JP(%F&lnzXA^&0-K3EzO}6HNnY+gZ+t~k_`3KeGSy8wd007%x BK&b!# literal 0 HcmV?d00001 diff --git a/data/rfid.js.gz b/data/rfid.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..46476c185acc4673fc11bedc749cedb1c38732be GIT binary patch literal 5860 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 literal 0 HcmV?d00001 diff --git a/data/set_spoolman.png.gz b/data/set_spoolman.png.gz new file mode 100644 index 0000000000000000000000000000000000000000..d546bd86515b33d27251f8163782a630553d8169 GIT binary patch literal 8932 zcmV(PG7=#i6)MkW$==wAf3}Ip00^zI)$&`DP~B^RM;K-fPYJ z_n!IkQcFV#51Ser007{rD9h_0zJm~ZBqloInCqj4IDy*asAmK-QdbkVfx7Zq*+Q)$ zyne3kfZrcUX+L)>8)pa%XbrJCH=$^1g;R670}Ps#m!6HPm1vmUU9_l-={&0z&}i2&Qgp<>RLcKs3!y{ z#4E(h$M_fU&XBR)K|7fhP{@=}A zUH`?y3#Q-$`|loJdj9SZkPgHP>g{O*QSgDd!I=J__#GE>-AZwlIgk+5QI9Aa3@5Ab&Ca zf&A{Bi}&yJ>bp52#smHvGWr`sI0*`Z{^?4_{~7y7Hva6PI@A`?L4p4TsmRG`c|z?R zT@aX;j*=`;ML|xOUrbn-2h95?4I&%j2wz7#e|aky!V1g>7UJOp^MHl)_`%{}QE@&I zEL{Ew1e71%rC}|8eTin_U;;@n`GLridMQzsC&(1Hrt)ynO%a z;_Co$`){2E{na(lKle=%^l!cY)8L;f^|t_k{!##hlz{%BC5Xm9)Cl5+kRVTl)}+>3 zM*#pxp^k{W{98T%0QO|>7rznL@H#CnFLT7QyR=!6DW zf$uhiIh`fc=&C4f_SpB(tMjr4+V9nZJ2P`Q&zlBKm}vpdtuIB{1(=lTi@(hE@OP(k+8-vQ0S@=cJ&j!1K)h_9}cN3O_9FNmX`LBL_F@k-NVDBz9# zqMgaz=>#PX4T-lVR2>;Gyf$%C!9!Llr6G)w17a~Vc?^fJ*|BDRuJp0Cb49N{IdDUz z+01-qLvnXsGp(3qOG0bM5l2&&tEHur<-+vK z5fnlXGGsD-$6)Yywv@JsyB?z?l(Y z=bkoGTeSO@oO6l4!eRcLdrGTUu>vk7LGOD_h>xtSNQf18jKxJNaYwrQR??wekmDhR zlbXN1{kC-kbQCy!Sw9%RbbrJ`52V~sH-6p6H+ukA_fnN z5k>7vL_4iW&x(LD)9!k@)Cv02`_wrp?JpCPJfgJ{pzyqs>pKRZ{w4zFo{S=h#ztq+ zuTbz6D_(wCc4B)_z^87H7rjOwClz@XBr&^UiNS@M!UGc{z}z-cz)! z5hDr!#z(%k&?k*x1Edp?h?&**e)C>&&aY=lfNsX*WT?wp90kQ(eEZ#G~#9xNe{hO8m9^V#LnW<16qEMNlK=?)$;#9$Q9k}f2> zd!4s9YPIIO7)W)=yDAw1JP9r=go#UBZhiVfFehm8VH96CcU)FzUTjF=zHjFW@+1LA zhdDDn3WdXiJ(W0GDP`lymDaEJyyOv?2M1vFTs>y$WqS06Q7wHJHs5?t^X}M}oi=XB zjK%EgD0A-Mv?~scXJww;UZr_9p-v^?3iI_nBY;j5MFM29`PD%N&~0uChFN z0O(IbI~D5TUvJ{Am-67~hNTe)3%9nRLd1pefH+;qL@3s>PGe>Ri>`FP;>LYXngiJr z>J4Ade?0&wfnuu3VnY_^UD~T9Lgwr%E>+bBNaH|Hh&nanRUEtcR$2Y9?@LaBF#Y^$& zQ_Mi7c!?F^+kS~`_y$$YN8wXl|MgA6S9!p7&0$O&aG^1&YuDcP~_L$!>8_ z%`8*T8AeUSR>g57y?@co**KfU94EyvpW2~FBS=g#eX#MGM64}uHI4o9Wz}EHOYs* zitq|0MU<9}eUn_?_nmDm+aLy~CTY7uj`v=~Zw_h4@>LndUZVu(A}ZuF2VFzKWevTkuOqmLpOK#E7o%)MO+Z3AY&C1>FY- z1gyRUl8@V{-`Q{E$LU;Oa)jlZqiQIG#9+6kF{==wB9-Z3*Baqw`~t}gsn(c$0D65d zQ$%IK>!bx}L~wA|5&DhJXya6#dG23XB;Q{dF^ZY*31J0~moMf@7#QWh$3#*k$)v)@ zRZkj|xSsJiUP{@m&}Qd7>Q4*W~qyHE)CLv^9vR z=f;p(9)iOj`^KQuj5pedJ4%Z^0qMORe{ZJj)Ip@n# zTNl-!I7PB#N4pIm#I$GsC=Ljsmk1Zb>XEPyt0ud*XgKliF!@$NvvPw_xUQL(fqMd{ z#<8-T6*0l(_PE9}QT|08`Qng*u4)0BA9sX6>$V7DS>P}jG1#zfAY$O)EL?f*9AYII z*!~AQKOeCq$@D17BpFO31?`#zmrqy(?7jV}9@{7bv4ZJhwl(ML9!B;>*%rrS7Ha0X zU-WryU56!oA2$zOLgT8{$@2>aW?naiGG_gYdp&{ut6Oo+;x%8nodH zTE$fyOKxzKi?Hcgp2tL!(fXnz!*MusqAf7eR*Mu;dV*F*{B;|{LDniwwW`$0L68NH z{#NkEu#W^b-a4^%<7eSdPoNf2~D1;muIdMz^wH zPg8B*I@;ru2Y0dU=^(VG-p?Toqc+1@`9;nIaW3bGE9>>WiQ~Ccuz?8-5Te$_hsz#| ztUmtW^WtV~AWHw{Gc~nI6Cr^06Yz1OeuE_S0jp&5WcYXK{v`3TMGifoTTT-4hs1z+ zH@!#V0A)%MJ*itXCTew*a*&k5UZsGST7zdqh? zknliR1~weyI() z-!1>1U3}hkHI5un*j2~vmlwU@qG&J>h7_0lKp*8UW+=`m#X;P$_*C+3rtej*_L+tz zC+97Vp+le7(+Y)WWYWpX?1x+mTpPh$@h-vJeHoAz&ZTSX4KXUH*@TEI8OdWt!nPIZ z3BF{FlH^f4nW>N9gklFia5x+ql}tDNlO!JtYqR~AQ{^5`+Y0DW;U;0VHS|}#IkMGj z3whQQDv;}@B55o-6F=oDjjY?e-|2QC+)M}u6!VmRPeEZ7#;0sJZ8IC}sAh@g-M4gP#UsG|mCWbrKA|ggZH6U7!RsS@!hJAD{#Otibdr3a8dHdMJlc(Au>NKHlm8E-$Z#WxRA@q z$$dXQj$S+NUtb5JqocDnr+8!7=ERLjNr? zhK3l?y`h$TF)qS!Iho;oFH4^{qR00)TcvZ4TU48;L*(CS%fFlOm^ z%KXGZN@Zff(Qd1$uOf%|4$g^wc}lvvB$#r*H|HmJ7&ZzRspfZql-&@E$rGu=ex{bpyK~yLTO@VMt^cmlT_jTl%o-MERFGTW_-<)A@d^V z%o7GQOk2E^*cai3gmSoe&kelM{yJ&MI|MS z1Ud=f(G?OEX5!7BVXZSiRoyhKH99?p%b_kv{De(u@GRPp4m{60dGNCDCCMkncBdK6 zgXIRe-~z8F;CxXvujv zTYyv{jDh^gw3c)83KJH7p>Lt?q{Kf@b%^PQm3=oPmS!P@>!B=xDO zqZQqeEtTAuCtt0zkBO^26;jRXtpX|?=Uyj_jg5&(LmOeDvg=5*rRj_WJg?wS&1vErvI@+P_)&d?!=>8@UBj<8?tGQhxpZc?&7M+Yq99tf*woma+V51_7!oDY!H^<)ap+2S0 zh_hl@9UXM=)@m;G`0T>ZJ-m@_>efB`!PHxzVf#VsBU?wn(y zhnFAD2G}5;zR2jcBpm_*0^Dz}Jw$WIUYiyGGB?&2_@kZZ`Q}kd203jab)Tt%hQW-< zn7@AgN>XD@9<;52u03W-5#iZ3Ivt86M9vtFM65y(YCzSSHTn%JDw}MqA;pe}aw}|U@qap=yD2(7Go#*I%&Mts zbCP=NoE_mKtZAs|p;v&fTk|Z;cX#hJ@jg{NvBPL>zgxGL<)oS%& z)5MjPSvUR0$yn3<8G~<&%T5)v(%;TK>mMmbzr$y$${g-v`T%ZLiQ?iRVPezB z>52n&lsb(_P?Q(+X<{gG`Il0Vk*t0moL`kZ^^hEQHer3SH9!=2p1mdrYu5kJ1BDjD zF6=8yQ>Mp0Gaek+7v&HZI-=uf^*t=kbwtTC7Wke4MxZ-xtOwlPW1oM`!pO+->_b3} znlQ3DBkngJyh=23d%VV_N*0yWc?3R8+S8GueT?-JYK6dU1U}%|Ag|=r-2wYySH{b5+{9tqRQe@nw{B=Sbr?$GT1X^k6N#F zyzsmKxx+6hDY*lqTJe}3iV_dQNT;6K$)tc|g{&NcO%6$xZla>lM>kN0d>|J0XBnsO z815W2T!V$Y4@?eGTbC}f7xPBi{JXLpsK%?3wR_dcI#c_HU|XJIZKq#oert$%(9i8U zVdkpz@{TAbKc82)B(7$`Hs%?Ro5iTc%`s{e%777XJ38nMDjF(9b<0T2pC1ZI-u;;J zgGW-hAI$U5^maOx?ipkIU5cl+b2XUgU6Dba%mzfYQKw6=1lH#E_-bk{XB1ae;TLF? z9w-o?&6O}IC4}twS3YYcpL^y@x45)4F+VT*;qEPU`7cl-3AZnG3VzD~l10ObhfJ)f z=+HCq_daeF833($Uq!{EJqZ%o^@{++6A*G}S5B1iE{r;wfPwz1L?BDe!O1CXe1~QY zcfz`Mq(UXLh;$;YjW4Ph_^K(mJd&We$m(4L2I(n{ANF%i&Ycp9nx#X&EH%WsU_w0; zvA#wK`H#y>jb;tZiH|>P%%|N^5dr9Z8W3t}Le222)NK=m!($+GEAWeFNks5L&ioQa zs@U$gZ+4=&8glv440Npq65Y~1Ls4<~YSUT`Ck3gZSD|&-%Q^8obHln{ev&G5?_U(w z))KK!G4uy<(d=R7S%7F(lex4i3!LCeDb|jO!MS`B;Cr8ji1DV^9PKLg3-QIptj#M& z{?fo2Gt7|jCgR&er@^m}mTY5%^m4scGB~M1=#KyN^mLbta3b{Z16jhRpeA`*7-QG7ILy2j z`tPM_tdtd;gEtvd($9--hQ@IosvYb7vS$=s-5L%irH%L2sUQnqM<0jPJmC`@rI+U( z?y;-yhP%ffD?giG?j$v@Hk?baQR3+qm_zdAeZ5nZN^#zsR~vkNrv(e#K~o=9^J*Xe zRsZZ&et=)O`NMn19kbM)MCr(KbxLs7$TigmggmvFx!u~ZyMcdLMy9Oe3>U!3tP6)_j=gaT{3xCF?92IVYv2w^i?RcjBm)g(G#&yZFOnmbO@r9lwYGJ zY<`=rWzw3h^Pc78GW+&vUIyCX!G1QkcH??1O=dB5+j!Aoa>+&@l;`9z$@N3^O;7|{ zSRyj&ip=(b#5-YoOLhoB2!8eCt)3HiRa!@;-~CHN48z2Dbk-5Qw2Lh1#o8_SLqOAx z{V(QGQ62wnv&Ou)o+i3RNkpTv=lxw;Lq|Gp32zhFjCS;W3fXtwc0N6yxspw6n|$$e zC#5=rCGf+Xs(D+<{UM(Ea=VwN2_(572TnZ5!6qS(3hBJ+nO);esZ%IDW9x+=yRdH3 zGRAM6gq$1++$c3-gmrVwXfGVs+iK^YM@!Ho7&xarlxX~Zx4cEuD`HN6rYTYV?6UOi zEJ^w@&Elu;7c@%W%S&Vk5e4DTq3T-+dt$n;q6zsU?#x8g%JovF84G!D2YL!HWjo6roNv)Gh=t^gn4W*+Tw=pjkNI?+S;$n7kU+vGNxC zb{Zz_Q!5cN2X*@B;{Aprk=}#%?W^B0gRW97n3cb$_<9&P4p(OU(VcXwlO1ikbYKZH z`qUX>f=_^X9OT&fkSFkhsr)K&;=*#yL6Rd-l>2VWT3)iHr}x7%_PZ~W6eQyhO=}8y z_p3_q2f-}@hsCUk8n|P7b$WYn(OntaoY;d`!~Erg5oS?QGQ(xxJ)B}^V=dn$SvL;u z^YU9j{>3-e;r1rbx8u%+h1-^=<2w(vziVgh!hTiUkL50|Ds;N_GYRjumUg&aZgsk` zA+)32hA6mc{HcgPH%#tBr1{o%8M=g0OZ>^wgPbh-Rx?l`%+XOai8xx8!^2OI10P0E ywD!Aun literal 0 HcmV?d00001 diff --git a/data/spool_in.png.gz b/data/spool_in.png.gz new file mode 100644 index 0000000000000000000000000000000000000000..aebffe0c9e34b96a7be322853e259199554c8670 GIT binary patch literal 21835 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 + + + + + FilaMan - Filament Management Tool + + + + + + + + + + + + +
+

Spoolman API URL / Bambu Credentials

+ +
+
+
Set URL/IP to your Spoolman-Instanz
+ +
If you want to enable sending Spool to Spoolman Octoprint Plugin:
+

+ Send to Octo-Plugin +

+ + + +

+
+
+ +
+
+
Bambu Lab Printer Credentials
+
+
+ + +
+
+ + +
+
+ + +
+
+

If activated, FilaMan will automatically update the next filled tray with the last scanned and weighed spool.

+
+ + +
+
+ + +
+ + +

+
+
+
+
+ + diff --git a/data/spoolman.js.gz b/data/spoolman.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..08a2bb82672aadc9d5c813b0f8594c6acde957ad GIT binary patch literal 2821 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 Xceku}hm5x}9zXssW0n9nH7o!CdB}gT literal 0 HcmV?d00001 diff --git a/data/style.css.gz b/data/style.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..27ad44c46e2fb4ba3b141da358585b9dd46c1c4e GIT binary patch literal 4898 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 UTvE|)pS}3>4;k-a^;}p00C8HHA^-pY literal 0 HcmV?d00001 diff --git a/data/upgrade.html.gz b/data/upgrade.html.gz new file mode 100644 index 0000000000000000000000000000000000000000..7eefe82005fe966781024222928eab66774f0d10 GIT binary patch literal 2583 zcmV+y3h4D8iwFpmSkz|%|8;O@a$#g;E@*UZYyj;V?QYw;^?#m%5zs4pjit2PfG)NS zv`ve4Xw#xe)@>IT1ufAw7n#x}DZANjo@H;b7q~CBb4bb2w_~rx_GA8$Sk&R+`Tn9O z$DDw+7!RwuJ0y3N%U@ihr! zs#M?zx}H(#+^f#KGzt!!h^sWFw`XJ?v#(=9W4;h0uGvbRkr4Q0a!eL9JtI#gTa8Od z3?jZ-5G6w}uQ*vGp0PI?gW(re{0^3#f)IqMV<^#yuSY2A8jOKkJ}Eq7qEPqwo?JN2 z6r=&m@DBi6cK>eL?M?8qN|O&nm84aB1aWo<&&cUXo1AFjh0gR+Q>iCD?Sj})pbo$= zI`n{nBPH>Q0_T_cH~$4)&9a^?be3cw+voVN2P{h$l14znwf#~7o%q0h&609eC{1;y zMi~1j7fkkOItN8FYtwaE!8vG@KxE=k;LMQ8b9gE={-RHJ-|*l<;N`O~_c>eA)yN{X z2;uqCK2EzWF8_KoDd#Tprs3v!(kc77aT>YWP|3(vo9G~|3Is3#0jI7vrDY-()6e$p z8L(~_$az9UqDh);m?X)3P9T62o9jrFNsL`t3Sp9Yb&{noKjYX}#Fif#1etk!ISK0WR|4+VaG; z{on$ZWt6lZ_WAV2psxTP7g4 z$HetFs@^`;ka~$&0mtb4!Iqi#vLhM-ZB|3YU^=t!6a7VWM+S!)lwZGXwG7 zxZ_R~ee^uP(HZn*iZhAzl_--2HX$Kv2?4z!S;$}i_3J<33s<@mp_MflL&;!`wBHJC zWm&K@>?RlGe$3Scy%>}*4N=%-%+sLNMf&7lmS-+TGdHmYyu}Rm`KU*n6)e^6eNQYM zE?&aYz5nhYbzAeZt-lNi(sqVGkr zm41v(cz!~@;r}xL=9|s9ODQY{f`T< z957i>TckW^eDqyn%AxV(P*>d31rKq(9WHlA7*wwPHP4@z1ko)q7Uq1B8RJB77D-4) ztFkqA;%O;aOWfD1)D!Zghvq}vF(0UxN>M3?9XAQBap685NZE07&}a;xx5u zumc_9JbO66zQ*5U_ziPu=~}_=-`dN#QjeCKDI8yJC2RdvTNlxN&PheF4zHIw3~J-lBP(*(B|xVsqV4GSLb_l%vW&s;ADZhm3*rMNCA_Iz=N zd+@tPBI`F0ov7_d`Y`dd@tIGS_hA#ZD6S9UvN~q(Lj0fbST_NPKoHxn-&WRJhJ0FP zHA6mdxYLy>YctgTZ0xp^Qk#por;oY-Yd>6Q0M^BH&J~@-7#?xZPiC3c;Q1A(_Cf0N zI3Bq6b_4GVel+(57RyiW(1SOxC}h2v7FYqmKa>d`73D%7)(Sf8&Y6hnGx7Ui^mQro zq2{08zk8!~`iTKWsu2tU&P!4zz!pDTUO{c=`uSbRNpWzeM9f}cV*dl0JcQ1xsAKS{ zr>CdJo7$97aV#i<+kI$fr8uYHK+zd-$YXna@dKMH0LSTrb1iN}vJtkjb%uMFgJ$11 zECzSa)xWc?nbY>E7dwoi(Q9;B#dp#F1=E{E-dOciuaBJn>-fPs?x>p1?L`E}me=`X zJ*pI79yV(t8o1k-V#=Im2vP`D>>9SVBU?#8we~7DzfgK{`xbDQe=GpZ(<`Z-zWFWXzX8hGh_z@b006}T2Q>fy literal 0 HcmV?d00001 diff --git a/data/waage.html.gz b/data/waage.html.gz new file mode 100644 index 0000000000000000000000000000000000000000..1ec7b06facd796127bf43ea5d4005f3fac7e1a97 GIT binary patch literal 1658 zcmV-=28H<_iwFpmSkz|%|94?wXJsyEbZu+^#aL}`+cpsXo?mel2H3$ODQQ<=aBKrh zmZIB|Hki{D`&L>y+gvD8BPqLHk^jCUCE2nqJIPvL0uqbT-SO_ZSE~Oa3}J>Wg)kiU zU;O<3^6t;uE120#43GNm2LzMTL4Y!F4~TMj1a$Q?v<#9N(+2Gz_;B|o{4r?0k}ShP zFz2|)m9_ySN?Mdey5Omu4N{!*1Vg_#0WP`aOoS$30taW&X)VffD{%OR3wFaKgy8Nn z5(BhkQ}nlYN{N14QkGnT%X`o$1_7sS1F*}Sbm19s#JQXXFw;001o4E;9YI9@f*n?4 zmjcZU(bn|-Nt75<6PrZy+?ES>P0%K@ZYO3rkLRcjSF&@wdh4#p&QNwWnp{bPFc?C8 zAN^&N>>js~r;P9<(k~nD+(pV83)NPmoFE!Ns*=Lt68&AEUXD;;VwLW8qLoJHJ9790 zx(zAEEnB&(K@wT~Y%fcn(x#nx2fhcVXuZwuCJ!4=9=0q^n8OaWR@&L>EK`KGf6(n* z`R5*AE~m93z0L`Eg5%1jeq6hxAD6M(AFFg(xhv&!NCY!x5J)y3Gaam5=U;jU4}z4N zT(D&iCIUa70~35ILvArMJxIu2)aNi|c@JJ{%+4D^yda)U!RUm-OQ@-ee7rG1fnP`Q zH9Zb$MI6nxgod8(b?BhpqVaUIvpO^S#`(VDslW+_ga$pPA0lkw{$aR3o9N}HPBAIf zKx=DBaP9%m<8;=B6RWc@7>+E{wjZ;76bnY$5t*wF2goRql*kxaKC15G3zm(G11xN; z3c~g$_j7=($fug6q{4^tW`ndJllfbbRJp=fW(yO#+Q+y=eZbQdsSC3;(C?V7WsPWUnSjtIB z8+K331v!i4fS;;>8^A2L%YIA*dpX~-IRb;%r>9eB00;}@)0w4dg{6;3xD-6O2Vx0) zS#O4SaG3MW%5<0%ntn75hQ{h5am=QjxgWOyaS)vmp$ca`xN>l;5jw1#XL{L#TfveN zR*zAI3z_>IIj?%~J7$WYuJ|WfWp!db!^%eX8V7a*>$XfzX_R+OXvZ<_+5C73Zk>V! zT38qw3S}Y0dJHUQ)s3RioK~l3uY?~#E|$Nf-OdJ~n_1UWb|HO0IEj*m+mARNspKAQ zcYAIvwZH|eNj@!1FOI+avfwgRi%6)%0}#!WvF^z75HHN9tqFNcW~8Lb(T&=);oh;_ z4X-r4bvvuQ-PAfRWQwgL_=dd^C(HEPyPIn_TbDhnvKG_ME;C9t7I@)(Xu6a!xV6JW z1HY9OiBRqg@?0~>QyQhTUt@)HAMI`*wPnJD!M2Ui-ti1+Z0l}^!3n%PJw1I20NE-G zyEv!FJ3e&EDo*)QvD0j!+k|%P{_Z+GGdB`0;VK5*Be0AvTJ6x?8a<&wTrkawc zND|U=FV`cWe?%dC+i3y1o!ys=ca#Z^o%E$b;s1xVChdYA0Lf8%jPPf)|7t>c^jpk0 zMGy0l^Yylrg>auKkDXlCY!59}X)}JyRl05a-m=%6?>fg3O(ve740utAI)9p=YMOgY zM#F-q>crCY%0>P)r}2awMFg(p(^D@z{cc1)c8<750q+>BOS_5G1c7WygQ~! ze&2BDL$hNXYBJkR^VtScB{3+|t}hHUt#CQzlVx`|)?Fd!)m7kR=XI4aM6trVv-QPf ztIQCz?{lX%6TLQ&B}-u1MM_9fboVo1oo=K zgnv*crvZYXhB5LCt{I_9P-_?=9i+?endFNG)VssV?kB7ATNRxU{O8wy0k8#xQ=An5 E00+4%%K!iX literal 0 HcmV?d00001 diff --git a/data/wifi.html.gz b/data/wifi.html.gz new file mode 100644 index 0000000000000000000000000000000000000000..761fca1a718093519a8141530209067d68894f82 GIT binary patch literal 857 zcmV-f1E%~RiwFpmSkz|%|95F-X)b7VZEOIoR!xuFHW0nyFwL!V{s+oGm}tSE`XTaa3Mi7IgwDk|>M?`KtBdPU`+Ehc}CH-q4d)$(u${V|0rQbZdf1yY2VZG3Dd%;u~3rOne zi+?}nl#Q+qEBFqAqqCWpM!ue`d_9Y_!oVF_Yix)$L}r-nxUgP*i0hGGshio6&FU>g z!0i-Mp3N!Av$0n5ovDvgx@viVN}+Rw(0JIP75}C#ZpH)`qL!{#c-+8V(U*HbB^#Yc zPo3L9#qpB8hX(r%{9viOUnq%+WY>VR6_=MXjY(s@q2j`ytN0gQ7PBJ(bFN|GXV^{x z)n}N9YwzaH$X&?&bY>z)l*|S%^M`>KPXAcG-c7uD>Qlx}E!a8}na)?pi#*+3;tA(2 z6y?^V^?8P`A)b-FV_3KyuE4mFjOvgh-%hja9d^6n$`Ra|fw}!Te6GNTzOh)d3!lcx z2{g|*{Ig1$QsF%M!6o7DL#fGL$@BybWp*jo%LGr*+VIUJ>q6{8kPj@)8Gm;zcmJc| znee6U?SHXtu}em!qe7OqqgcLPantlBU%p*8FIs$haF#vJeek<{l)(4aUN(b8&wT

}PM>c}M07ccg$%au3AEZ9G#xL;<3-$+HM6 z^PN4vHgrGu>7|Md9|>7%nx51X<=6GNVb@94bU-z*xFrwMxdpEw)`i@cGdl!FGgyd> jF$JD4UdMb}O7pBgNkyKGw=A<5|2X^usRilgRtNw9Mi{fI literal 0 HcmV?d00001 diff --git a/src/bambu.cpp b/src/bambu.cpp index 9b9a67b..63d4434 100644 --- a/src/bambu.cpp +++ b/src/bambu.cpp @@ -549,20 +549,47 @@ void reconnect() { uint8_t retries = 0; while (!client.connected()) { Serial.println("Attempting MQTT re/connection..."); + Serial.print("State before connect: "); + Serial.println(client.state()); bambu_connected = false; oledShowTopRow(); - // Attempt to connect - if (client.connect(bambu_serialnr, bambu_username, bambu_accesscode)) { - Serial.println("MQTT re/connected"); + // Generate a random client ID suffix + String clientId = String(bambu_serialnr) + "_" + String(random(0xffff), HEX); + Serial.print("Reconnecting with client ID: "); + Serial.println(clientId); - client.subscribe(report_topic.c_str()); + // Attempt to connect with clean session and will message + if (client.connect(clientId.c_str(), bambu_username, bambu_accesscode, nullptr, 0, true, nullptr)) { + Serial.println("MQTT re/connected"); + + // Subscribe with QoS 1 + if (client.subscribe(report_topic.c_str(), 1)) { + Serial.println("Successfully subscribed to topic with QoS 1: " + report_topic); + } else { + Serial.println("Failed to subscribe to topic: " + report_topic); + } bambu_connected = true; oledShowTopRow(); } else { + int state = client.state(); Serial.print("failed, rc="); - Serial.print(client.state()); - Serial.println(" try again in 5 seconds"); + Serial.print(state); + Serial.print(" ("); + // Print detailed error message + switch(state) { + case -4: Serial.print("MQTT_CONNECTION_TIMEOUT"); break; + case -3: Serial.print("MQTT_CONNECTION_LOST"); break; + case -2: Serial.print("MQTT_CONNECT_FAILED"); break; + case -1: Serial.print("MQTT_DISCONNECTED"); break; + case 1: Serial.print("MQTT_CONNECT_BAD_PROTOCOL"); break; + case 2: Serial.print("MQTT_CONNECT_BAD_CLIENT_ID"); break; + case 3: Serial.print("MQTT_CONNECT_UNAVAILABLE"); break; + case 4: Serial.print("MQTT_CONNECT_BAD_CREDENTIALS"); break; + case 5: Serial.print("MQTT_CONNECT_UNAUTHORIZED"); break; + default: Serial.print("UNKNOWN"); break; + } + Serial.println(") try again in 5 seconds"); bambu_connected = false; oledShowTopRow(); @@ -570,11 +597,9 @@ void reconnect() { vTaskDelay(5000 / portTICK_PERIOD_MS); if (retries > 5) { Serial.println("Disable Bambu MQTT Task after 5 retries"); - //vTaskSuspend(BambuMqttTask); vTaskDelete(BambuMqttTask); break; } - retries++; } } @@ -582,17 +607,32 @@ void reconnect() { void mqtt_loop(void * parameter) { Serial.println("Bambu MQTT Task gestartet"); + unsigned long lastCheck = 0; + for(;;) { if (pauseBambuMqttTask) { vTaskDelay(10000); + continue; } + unsigned long now = millis(); + if (!client.connected()) { + Serial.println("Connection lost, attempting reconnect..."); reconnect(); yield(); esp_task_wdt_reset(); vTaskDelay(100); + continue; } + + // Periodically check connection status + if (now - lastCheck > 30000) { // Check every 30 seconds + Serial.print("MQTT Status Check - Connected: "); + Serial.println(client.connected() ? "Yes" : "No"); + lastCheck = now; + } + client.loop(); yield(); esp_task_wdt_reset(); @@ -617,15 +657,30 @@ bool setupMqtt() { sslClient.setInsecure(); client.setServer(bambu_ip, 8883); + // Generate a random client ID suffix + String clientId = String(bambu_serialnr) + "_" + String(random(0xffff), HEX); + + // MQTT Connection Options + // client.setKeepAlive(60); + // client.setSocketTimeout(60); // Increase socket timeout + + Serial.print("Connecting with client ID: "); + Serial.println(clientId); + // Verbinden mit dem MQTT-Server bool connected = true; - if (client.connect(bambu_serialnr, bambu_username, bambu_accesscode)) + if (client.connect(clientId.c_str(), bambu_username, bambu_accesscode, nullptr, 0, true, nullptr)) { client.setCallback(mqtt_callback); - client.setBufferSize(5120); - // Optional: Topic abonnieren - client.subscribe(report_topic.c_str()); - //client.subscribe(request_topic.c_str()); + client.setBufferSize(16384); // Increased to 16KB to handle larger JSON + + // Subscribe with QoS 1 + if (client.subscribe(report_topic.c_str(), 1)) { + Serial.println("Successfully subscribed to topic with QoS 1: " + report_topic); + } else { + Serial.println("Failed to subscribe to topic: " + report_topic); + } + Serial.println("MQTT-Client initialisiert"); oledShowMessage("Bambu Connected"); @@ -635,7 +690,7 @@ bool setupMqtt() { xTaskCreatePinnedToCore( mqtt_loop, /* Function to implement the task */ "BambuMqtt", /* Name of the task */ - 8192, /* Stack size in words */ + 16384, /* Stack size in words */ NULL, /* Task input parameter */ mqttTaskPrio, /* Priority of the task */ &BambuMqttTask, /* Task handle. */