From 4f6f0211ce74cb82b1c72c082091fe0e9d887ecf Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Wed, 14 Apr 2021 14:50:56 -0700 Subject: [PATCH 1/2] Add option to suppress error and more init checks --- adafruit_funhouse.zip | Bin 0 -> 10507 bytes adafruit_funhouse/network.py | 39 ++++++++++++++++++++++++----------- 2 files changed, 27 insertions(+), 12 deletions(-) create mode 100644 adafruit_funhouse.zip diff --git a/adafruit_funhouse.zip b/adafruit_funhouse.zip new file mode 100644 index 0000000000000000000000000000000000000000..0eb9fecc7eba3ab45f2215a2031ddad1d9d920a7 GIT binary patch literal 10507 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 literal 0 HcmV?d00001 diff --git a/adafruit_funhouse/network.py b/adafruit_funhouse/network.py index 16c1e1d..e8a2d05 100755 --- a/adafruit_funhouse/network.py +++ b/adafruit_funhouse/network.py @@ -64,7 +64,6 @@ def __init__( debug=debug, ) self._mqtt_client = None - self.mqtt_connect = None def init_io_mqtt(self): """Initialize MQTT for Adafruit IO""" @@ -99,34 +98,50 @@ def init_mqtt( ) if use_io: self._mqtt_client = IO_MQTT(self._mqtt_client) - self.mqtt_connect = self._mqtt_client.connect return self._mqtt_client # pylint: enable=too-many-arguments def _get_mqtt_client(self): + print(self._mqtt_client) if self._mqtt_client is not None: return self._mqtt_client raise RuntimeError("Please initialize MQTT before using") - def mqtt_loop(self, *args, **kwargs): + def mqtt_loop(self, *args, suppress_mqtt_errors=True, **kwargs): """Run the MQTT Loop""" - try: + self._get_mqtt_client() + if suppress_mqtt_errors: + try: + if self._mqtt_client is not None: + self._mqtt_client.loop(*args, **kwargs) + except MQTT.MMQTTException as err: + print("MMQTTException: {0}".format(err)) + except OSError as err: + print("OSError: {0}".format(err)) + else: if self._mqtt_client is not None: self._mqtt_client.loop(*args, **kwargs) - except MQTT.MMQTTException as err: - print("MMQTTException: {0}".format(err)) - except OSError as err: - print("OSError: {0}".format(err)) - def mqtt_publish(self, *args, **kwargs): + def mqtt_publish(self, *args, suppress_mqtt_errors=True, **kwargs): """Publish to MQTT""" - try: + self._get_mqtt_client() + if suppress_mqtt_errors: + try: + if self._mqtt_client is not None: + self._mqtt_client.publish(*args, **kwargs) + except OSError as err: + print("OSError: {0}".format(err)) + else: if self._mqtt_client is not None: self._mqtt_client.publish(*args, **kwargs) - except OSError as err: - print("OSError: {0}".format(err)) + + def mqtt_connect(self, *args, **kwargs): + """Connect to MQTT""" + self._get_mqtt_client() + if self._mqtt_client is not None: + self._mqtt_client.connect(*args, **kwargs) @property def on_mqtt_connect(self): From 44908f3c2ad2ff671045b4cf75e851be7c7bbb5b Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Wed, 14 Apr 2021 14:51:43 -0700 Subject: [PATCH 2/2] Remove zip file --- adafruit_funhouse.zip | Bin 10507 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 adafruit_funhouse.zip diff --git a/adafruit_funhouse.zip b/adafruit_funhouse.zip deleted file mode 100644 index 0eb9fecc7eba3ab45f2215a2031ddad1d9d920a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10507 zcmd5?WmuG3*QUEfxHKJV?H?F=X-qL zqvw1--#yo!=b1liU2E^z_r2D=mz)$V91hgOz)*`&_~YgOzObPvp!5v&jO`rF9CVBw ztxT;Q?Twx)E1^Rn3d}j`KEIz2Pe*4|C}_A-Xeg*Z?8yCL4+#nh%FNC8U-l*tprA;9 zY0tz?&&Jfuz@F8{ByGLQjn#atiuSH!CXj|tC~O{g8@>{Gl;ATS zG)cyuL}vcmSIn=lZ}L~YTA%bPfVrkc;au0j(nSyg_L))nLw zIjeyJ8JK_^>+h1qze1G6i)<7T6Bxgcgs^U3C&1wZHgXt+4=w`(XX*;x8|}M(n)*6o3%2rA#*rrX)A_7(IY}=z7 z3W1D|a9hm*4FM=M(lL!;wIxS+o^!RW|eBI%uC8L@Q%rP zapy$xQ3!m2Rdj7*X+POsHAi@bMo||CqxaE!_@w!!db_$N&F)?CUS9=&qI#!_o&yn5 zZ6o|n4u-D&!4_dZUuixx*rpa@4}F$FFX*S>s!gwnXb=;)BSQ5N^F+;{9k#hWnBodP zT;2$7ISnlLxH^B>&Rwd`1D%A2X^xH?Pck$|C?#yvi6oyqdQ)L+d`&T`P~(%k?Pxoo zp53{YwifTj(4(>bS7pxg417bD<_4Bl==x6f(Z)+^>Ds^ee$I54<`Nn z$!}a$VI27 z$w#Lsq@aw0d6)#C4do6e$|@78Io>?Z79nmAot_78qQL&XE_~nFTag9DzZUZ z+?-;fp=jPHg3-TO>7;wq&&O-Gfq_>=$4p^c(RsveWQl!wvW1v=^9#gD0h$a+EWJP+ z_sp4cJP6djsm#sQJ1guWliur;LMXTGWQJj*qBcM5Byl_-J9N( zq_^?l1ntkQ#+1_3dmyS5`WjuOljV+1r^v|2ce2!*Xn5+CYsopF!b4d37hp|S)Ai?%ZLBkfi1XLM9YBt6dpi$E;(HbzB@-w=9|i${}6zr4&M zkX;I7auDA9gh)fyDmHCFWeT}aW4fp=yR$1$V!WoK+c}+KYFZ0$cZ@+HGs*;BZtZnl z4!?(Cu?jq#Sn;NQ6mBZ{_{1?-{_}d`N)X8ZLSQ~aD2V`6jP`mNJ~@{GKU8$Wb=nCE zg(M2ZQdKV`_vsmON!@rb-y^OMFSEYlMhJ>0Wxd31?MQ3ixh+FsQS&33(q-yqFIX*) z?>2u6L~T>WVviHk@1|TNo(_<(OI>y$U>6c0ea8)|;;rGQreyb;tJF-smQV;*aB6$ByBT*28Rl(TSEE^1k?3?vflY`;VNb^^(h^uhZKZca9np|8 zTAndJ2$oAI9V){q^f6aEQ2HwH0Q?JIKA>>UnPGR-52qKkWQ%Z{! zxwh9>x#vjv0-wbUujR})fTaU5_kz`=(+VE8rL%T4zmAtd=w46Bfx@!xS`poWb9HL1 z+M&}Z zTfdOFB;hs3<1a+s`M%8K*)njseU`B-=O}2o(ILJ73>(@x~0j($r~W4JFe-_JJh#1+Vqj!~JPhg|bB6_yjxF1U6 z8)IN#%azAX1$vNhE1g~>o=0iPXkIjxH*saJywcqLv8j)w*WYc_)lRo;qs&1qO*ldSAD?X5NU&sb5Q7F1{9)3gi%rAHbU1W@+=D#~8~9@?yp z%2mB@P%Y(4+{SHZyEc|Yx6BroWD>6-`5M3i3rC}y(?mMvu3+YcoI!w#ii{dn5rysgN;>JctSGt_u^ z_o83HIX_7K3P#*%>zo33i$FzUXg@=dcnf3tS@Xk5RrzIm`sOu%&mMHy`|v&WGWAhc zQx0e`7*4S!Pw1me2+_co%peZ*1##y{gTrtS&Qp|^*4qBx2AwFbR90|>f z4h_RU>hQxxZsi3MD6l3ICiit`@ErE;%15DPkjuDf*J6xz3bs%C z1rhr=D#w$wSwz0ibXwSZbN>3HXlWydrnYZdXpwliOIFo(kAxAgd|iD&38_Q=(1m`+ zB?cM-%=;{@xWZX0N*Lgm+4p=$AS_onJHmI~jXh(fN9!j*ed&7rlu1s-t`7*tek~Ql z<)ffIvTxH*Gx?2VxiF6KVdNA)2o`}D1s<`AhgUt}z7~6@9~{49Nsh#iDNHsp#J{n; z=}Erp_9XB7_{~Sup`eeB*OkWSmU=?kO@sOUj0FfZKC^|fQ_mD9r#?WDxw3B&((U!g zXP+5@%(hqBwv`27?6?x#~d!{%&BZ5;1OEe?yH?*XzunSBTqTFmBp_x)UM?TIn` zKqQhD5^vPr)HE;Dax~5q_4QK;*QK_~5pID<_1Qc42SNw-D25s!LP0&y_OA*3f$Ev= z3H@)Ar@!I$|LXjS{~YWJ^EqRz-9%Mt=2!%C*lgLw$s0)PnkaziN~0~D-v~d%&hKhDJ2|bRs(`Rv3=%x^?H|HfuaETy=;-x ztohlQH-@5aDpi!z@VtPNVR~D~?W`c}elGUphZ*&Hh8w!WZ<`1DZ!WRP>JG`sP-@mE zif`e;B`4aZYQ(6j&tA`JxYmuh>@~%=(+taOTj=O@_T=Ao(YWJC0(+KJn&d&pz55Cb zy^>BEZrKnOyUettxiw+8`h@nO<<-HwwcTB2^~&2Ju+~odxD0b_7vzSz7crAjPpCKE z=nX#BwXj3};^YUsty8cByR7c;Io!l+2uNdEl8 z8`$jy4yKLGO+($w@f*y5^Y~QRyxBc&OR88qMHwcGqm=6{r!pN6$STJZN6aJx1w_#1 zfr^r_f%`L2&$3o!FBX=b#cNWazhQI@+H4AaT|;5`DOJ=$qYKQJr73Zp@gnaGAI^1o zE!=VG5;@;zCk-Zt^?q*SpT~(c&9a_DRC5O>z);*flF zHC3?)f)OF}5;$RH(f{j0P8FwSbry&1x}bkKrD~`fn>VuRKz)K;HY=BbBtKN(B``Qc znTaI6c!A_8J~Pe?ds&hZ&A7_o^5eeSvmKTsz%Iy=(j?ud;}JeXjKiS$I;k^k|9aYp zem&@#5v9!z?WIzc7czgB8jinz5U>%dwaBJ;90Lmh+X+!s$71c|>+PUDkKE<79vb6D zSUwKw^kd!>1Z%>sGzOUJN6)hW0Erx%L9XHk(i7rOaC@@vu?1qM(6eIt#P{ZH6U~Yv z=)OVsK$YPVAF7cGk>Go$6fM-z1&igNi$sJ4>pg9%_)yy27XLUub6?g?Xx4_-L=I_ zhlUHXY<#0`#UBawr~G&l!*GdfW~A~S{+yCT9%q3F;+@q4Yir8^cX47zmSQ#Tbp3tr zaU~VgN0HQZl2WMGNSI<$2lWz4oWui)q@Pq2PJ{_qlsktpTj$cy&;%yo$B38Pm)njs zMI9Yjb*mV+7NTqEI_;9BzO#?9Q;4*rIG+usMptuEkS^IK^9?aVXX8ILF;JsabSW;H zhHvV|OsR7R@M)=zGqZG@;f;s7M+-V=IRthvsW&%$BW|~*ev17?;Tvo3N;k^5QILb? z*Uruv{bEP=02GTsMHf;zh`^h@57z+(Aqc}6GYoO>MOaB+GgKUOgCsvVJuYBhObJ6i zR%;2C=H1mBEaX6H67<>3-ROD|c!AAI#5&b}<<0!0)Ob1{{oP~p`L_p6#QGN6SYnOI z9`*uBmZ|G)?qv+5#SY3%Nsd(=?Lgxkn#;^w0T(>+#PsKVyDOE}cw<#aX2G$}&L6`D z)muy>4@bN;5SIeWI*7U(%Z=ttbdm}Kc4moTkQe9M>pDgkaPanM^c*rW&~WN&x zY4^VA6aNT#UI)V_=dVWm3v=P z$@KQoxMb|u5e$bg1J_1}ezhoFNqEqKOy4a7M7Uh!gxBevF60m1KodQ>9E690dSHh? zS^8(*_mCafXsFXuMHf;H0}?{45pPLRP<4ILNnD?Fdv zr%#UYLYQY;r{r=upLcRvd~2=y-0i~PCEqJM#;K#~Sg?qJ zkpxI`TsJXBB-j(%bwe+E)s~=vL?s)PN+r*`1DQWC`Bn`K;5)N96rwq9$unpR=Q8$jh z45_Tnf_@!MlQ?Hbd$Bk!`|;|r!E2rd_5ehqO+%s>Z3Pt+i%*PdtU7U>>vn1eIv1a1 z7*S<%KbjIXZDL~j$mXe2Ckf*`!;>H9q#vb33lszGYc}2Gp!bZeDq$q?#>r(dUZ|RP zXBt@qw=Y>(u^QUA;{bG z=`;z3?^Y^UCZN((AHLJsr;Vu@GT-qxDL`B6+WOO+4l-WHw3$(iPAUi3zv_{lP34pOM_~}|+s;*db zU6Syl3hK<)U)@DuO6$f5Zx)*1Y^2K6_O2M;3M3!v+wXK}QTfM|bha{@@Xfy0#4-=< zxlqwqxFLTitoUYR(Pr*d=?Ap<6S9BCk^fg=^*506-;CNEdM>Uo!Psf6#zN)ccG>(oNVoVL*s)S^G!h>7rtArySJihZn{XVbH6_?TP&@FXK=`kyJu4FV zuiLjK0w^ewU+U6UMh;Hab{0PnyA;JqxBPxSJpTi+2i1PmRc-YTh#m8WIDzoEyhb7+ zLn5||5U5LPr~#bSq*r)S(6CSrX?b$WIvX;^GNttCZD-@^F@F=Ef`=&WWRD=GEMd?j zhdNV@TFUDSQ_;1q<>Rtm>bUOc-k4HhnoZ*uDxrk1z5}^bPoDr)893K8UlwqO`kbZj zg{wY~v6|}m_B1_KY6)Z^$-0D_M@7qhYdXRBI5J{@SR5qr9?;jQ}bXxfL(VSsIZMYScN=WUh{84Vr7>AeW=TvB7aC7^J?Ux9m)3d z`)a<9k8+tAj)_f^&BcYN<7t2L)oJWgVCs^_tc`zYFo_5Zj3b6E{LzKc#Uv=;;@maD zpN%0YH0^b!uT1PqMp*f7?I?a>6cSY9gslNe`Xv&7^}5agKDkdm=7w6ShxXE?>{RPz zHaT)04%T1V0jA#Qg>30k#8F*%Od~1ywMJB3pz;eRgPRB*e{;Lb)x8oPRgO}Uq!WvC z>L@2qTyTXnNi<=}QFXajssJ!t`aMULYSN8RIO^xj1J@pzby}K|VD`EO@h0$YGyd!?6oZL0ov^g?{2hOeVXSq$f$~Flp9W&97Ad$`X*d<_ zm;b_orny?Egg zY9unW*_n@n@bU=@h6skfUV6}p&7*LU&fr`s|~`O=C@W7HFD?AYd#u~z?wQm_q8er zL3mzk6-O65JDxpeF} z#F&`%u*opSAQurwbAjD?++T+LLOzg2JKT}SyiCzR_(($YaA7(LgtLERC_oW1+g0u) zR%6zACe~)M-{m%92KU{FMsr|0-jARcFE4vd$ti}X@w+z(DX9m$sW=b)2|-=%j(}Q; z63eJ@f%4d1{>S7Pr;I|AM%W0_xFcogJY^4LZnrtutO<+i?&2AF=TsNv;U{!*>67!< zVeJi9XLK{adP!#vf7eC<3_Bl^L>?x{N!t-_B6gZLwtg=^xK591aIjY;*zsN-@O6y zMfQREcsLEdG>ZoH)9J;>=k1=0OV5a)t!36_sODwHTwmVt-xRH8&p0b=XX#k)@T)$q z)yC`^8vKrmG8K_>7lm)B)0Scuo5RUJ&H~Zf&@_?XeN;LRfLu2*(0`8wLe6RCd%G?@ zqZVhJ9k_PvA`UGI7eKWnIepjUP_k>Gpaa=yIPFb=3$&;k5_6NlGn87N?~`yI{;JhS z2_<|0;~WhVcl2(Ggll??%BSg9$uooVR(t2WD*$jEe7y~3NH}7;?D%EfiMwP0le=5K z7U4d2(<>+I!Bn|3T-7{I(iI*uewA5?<%_t{gl}hZHP!Pp;MnbK2NtdKcmVEu=3UwN z9Yx94B6UG^fE}%)8U{hhrIh0q?4G*Qk*@6Z=7G6%g&C4*vdWEwM(Pqp_qccUt0D@< zJ!jvZBU^Lq7ST*$>e6N3zQ=BC+gO;z1%F$89))t;3jN0=Y+m%L-~DCx1Eu|$TKr6Q z52*#+KWVnV;l2Onv|{`ws)`@lFxtB*n>qL{?xPmdNY?c*z_AF^&E0yI#RFpu1*)9yzy;SKD5W5Wu0_Rp0QL+v@3X~ zXG^A&f7I?ZL{{~b-1hl>SH~ZDg{?tV?VtDE&@ec#zwZOd`5@8! zEZ+S4K00FjD$L)hG!J6`e)Ft|d82`rcKZN-JuEIaT?n5Qk