From c18f24f8dd55661841deb73acf04be9eb7011202 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Tue, 15 Oct 2013 10:55:08 +0200 Subject: [PATCH] add on_leave callback and use it; send email when the space was open for 24h (as that should rarely be the case) --- statemachine.odg | Bin 16850 -> 16563 bytes statemachine.py | 14 +++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/statemachine.odg b/statemachine.odg index 883e18348f8e3399d346b2f5c278b9c666b1d12a..d32026c3944167b32079e33514bdb8eda9882713 100644 GIT binary patch delta 13478 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%0A?u(?RS$v9Nkgxq`K6_F;mxhU`lTb z;hfY5CDeU8-@X<{1O11H4-V{}AgE;h`OyaJ<1)!u4@Cza=?KwB5q^0SgSIBTm-9^* zD*Ttn$MrReD>rT=sygEq4QM+Xg?R2@0LhHdG(PXv;+M={nJrTT&d?Xt82QTs3Jq90 zVAdkGm|G|0Wb*6 zCm>QsV}Pp4{`GGC1{b%qc^KqW-4b^rZeEFB;^@S6Y-cDzS?6{YisYPX@^Pq@>a6$9 zNZAzr2@$*GSmr|Ze80tB6n<)`->I7*1I^)75z+x$F8}yZ-aziqF#jH4?Dyh$q(brn zVVrwXg39;2)qiqgaqN0iMVrl0na3U1Q2Z^&qky; zU@r6*S?IkvQkxv@CqhGVR`aOik-Gd7U5plmbXYX_$RwP z<}W(kr_vCpZJatY3b}<*MbrGl=I~~||&CG=c$!<9(1 z(oqT@-vP*tvgFhZv?nMU?j4;*pQiqRxGgJH8@xXx`(|Gzo~|0JuKQ6 zV5jCmRmkDO0=>8E-U#b{8fPliYo$#j8*OjdM-lBm>qIvLL#-LuN5t-r`}*|~+ti0l z>2VjMH&-)TmtJQsMGU@m95)b&>*OIrI+DXE-|!)ctGEN=oeZ|;E8gLpwF)@vzEK}0 zk%$dPDlJhi;#TY1%6eC^3e!J2N~ ztMZu3;V+TUOStg8W{#77MjMrr zH|Bxy)2VSyw<^<_dDTe1%iv|7_j5-xT(8WN;cmqXtotnYhW&82#fXadMTE>K{U3 zm^lcb5<$O~xt`!&GtWlHP>gu;#={ru?;h|xQ9L&BcEA4R>FC9JO@$_W`36-`7r?ir z?$=TglpEAJBl@Jr7LvRL)jz5YHAFW!?ZIPWm$1S0p)JgM0Y>tt&TFL!mE1Ii>K8$$ zammV`=%nsDWJ^%HydVDZV}v90NbUQPBx3@CR{1pXdZ_uo=@G(|6DTijHOMT((f>$i zI>bi%>N+c`r>WcDSx%~=N^G_e8CJ&E^ZQ?m%}O0HAx_svcH+eg(%}F*gaHRAb_sGq zJuTi6`y(P|=mXvCic^fPTe_~N-5Z1uvn(UDQ(NeIN`5*BS9pmoxSvTtw-#v1T?_$- z0+EOn+Pa9UJG*(VT#8fCv{-D*p+<#DSk7Um`h=CJ{-k&dfd!B)-3U<`*W-bZgnGK`pZSrd+~EtGmSCk10*RlQ8~CGC z=t#|iVPq)uPcdt|zx3>S$@zJt1`zgAcn(nD_QLu05-zXta_W-7=2s4(osyuJ^ukDO z^Amm4GjxNTjLrNA=slL-%wI;M;ps76Rv|sHZBbA22W2V*>}Pcei>lNaOLyx*D{pIR zgISVpCk2Rdb#X+MQAAVylmY}c8x~g9AQ+RWpa*T_gO_x03sV+hW&}`TIs|te+~m>~ ze*Pr#lj{KcCjxe8Rlj-mJzTLRN=`hPmsS7L8k3H_RP(F?e*qfr-h%G~>v^FUo5euU zR+1(jOgPE#GHX*zbLcZam!S0$gt6f>sh<)WB%ps zjqS_P#OfIEU~^;l{RC~o{+BikDWv^J$~oH{J~l-;yVbvb8j(zEWQlN{uCh#-JFa6Y z+Cksp>hyIi#?ws~zg?}BShK8pK&I-RMH1|_$M&w_8~E{t!1gYYEtAX2X>YbW@!H~U z3s(_&$&4>^)YR>5NNI;amiGHPf?yj2P!qwW!``q!>DlruqwK}7NOZRd?3PqFca)?E z-4m*fftG9ndU)L0HH^UcNG@a>fj%bewUN34vSd`_&djMH@iw#nSI44whq{OBgUh2A zk*r6vsQCQY{>`pFYg-5o0&0uJM=I2s{qy!=lZ+qc#Rs#dyxCQAGL9&J^r(+lzV2Hj z#}sD(T$|9|aU-e$q$UPP2A+)wr2~>HzAkwU>JzFQ^0(?r2o*h@J&e>9G0$Z&70l|E zIqs{lH@Ns~BxR7uvw9RN6Sq9rc2O?4d>@w&jI2Bc7G_My$mNZ-heM2*@!zMv>Tn%MFwR!2dX}@s+Jjl@qEi!KkNR~k zx#QP9E+C~k!i!Z<>A*PKk9$Dy@$5`cR(r%{9%IC}S|1}W*f-Gh$wQh#7E~LqGsBhv zn-=G)R$|#LXU`Jr<|%9r)oU^dn)lRx-|E^Q&@Bv5N=M+^AZKcU@ej8X2b$_$%Q|H* z^lVg^Fff=F9^9;GMnqf!$(P?JAjCHG^dY&i8U@0;Q;bXvemV{3hH}^3t@1Yojtj4_ zL9IB(+d%Hn#3EA__{ikiNe$rJeQLx3Y+s~8V^*P?IuJ9p|4SeB)xhgHsT)^fPJ9=qlqP8Ubikl}Apjn*3D=q1O z%=w#Lc#=evy?FTqD^XfSu&`g&#JZ)5s!J<0Pl;Yh>NCF`+0Jb%>*-K}taURKU|hY~ zlORsjoAGg>!Q(@+eF`)`)NQ-x$i$YG`(%$tBpmh}H07~5?j5UJfkn`b?bD?+LwP_w zKe~iw6N3AV@r$?6dAh|B1N^h~k45$=%dLGk>xL6M>Ki!3S(!l{)<6it!%-6)je@@+ zm2Amdx2WlO`EJry7m)2(i)VxWfFhNB(>zXzTTcc8#U=(%>d+GiWZ(TL!Y@HC7u5l!87L>^Us5rFUtw!BAe>c(t0C2G^n+8-UQ1M`dU zWvu>FA4!xrksbfPMKA}LzI%fs!5qbKOE=iqTBi)TUkh-wzY;Cbwa3l~z+ z;I)fA*_%=HM8NFa4OP0ZJ-{2x<3qC&qH}>pJLQchR)SzGzIq?=mjQ0@`mib9f!7MwgyuN|66PS2OSqAVo$n;0Cu z`59K+0{)Xz;@59A_Sw)zS>3eea{+?Ev2?)ApA>X+3uufYw`VL8nFO zQ!=q1%aGbyzk*%;CxDm@MpyrfxF;dr>KH>J#TC%uz?$;j*6a&0vKTvweebObcT0kA z`HB6HX@Y2u`SA)8~(Q3Los1FJ<-YoX_|tEjb3 zeBiD14}Nx5of&d=jZmsOlliE~glA{xf?Z(ay?HkIYM)Ks39xLC9~SEJu@M1KPI2ww z$8hLxmMPuCBu2tt!F-Y&r<7^Hul)CA{Hy6tGoPOB59mC` zQdUgMMSCO|kkrns>XJ>FH5{Iya|qWj5oP{R|Ut z%rfLIfn^0f=0MC*qnXr69(_#jXyP(9r||eS|2&(1A^CjlQC0#mVeu302Xwd3C7!&+ zUbwq4r@z<`1pWj)N+|Zrx-O21v2~d*{rO?cHDONjlH7Pm`*os5j|xMZFmbZ;WSQJz zy-gM6j(&i8`_C)5(}5a$*wW&5t8`J8s1Xt)XH`P%+Z#}y`Ijc{?u+qW^a)~)v^c+8 z%LtmO1sDAwxWf(u#G7PC`Xx<&a^4}S|utcd6 zN5Lz0ut>A3pzUF!4C#gMVa>A8^ep|QzNO4VDMMG;TMjtqRtnl0Pt1dSp1!V==FY*I zDhQl^I@SSZx3aq98ww)pOxl|3fRo$5g!_KhMTN?a>n`|0&(&!3M%`S_$L2~pO1 z@KyL%lb<`cwAqm{wp%p0%gE6-8E@Wz{f5^9g0k5cYnEhl?rv;4%~_%x!}` zWJ<`cz?QfiC>dB%RGpvQc?(_$7}!2PyXkxF?&Hs1J|Ir-=5W;`gdr#evf|5q4@U)`VXF; x_&*8`@yAyRkkkEVZ}-Z~W6<9PgEdGH2cyvY>ysTOhbYaCdiicPF^Jb8ra+3GVLh?ixHe!7aGEZ|=SC*1P*^Yj@|L znVOpJKGSEa&(zna8v?;*gTauLWFa6iKpQR&D{w1Pu#hAaxuhBS0r{{DC`kbVdc9lyrL5m3 z_?*NJG9Jt&`~*H5OZc@;wfe`f@H_X1!X0rM76XHu* zs22@F24NYvk}_^{bGY=vOrl0nz65Vl1i2GN@5&9O4jHS7?Vmx|u5TKeY)R3qe_}L$ zB}JRn%eeeDmtC@sxznJqoE@%E6Phz>V5Td`ryABNTm0HUCq6g$m|K2T;VvJ@0jShK zt2axCR+Roo52pSZYO1c*wDRL~9vPaOn1y>wa!YJl=DN$+*9mjFfH`H2MaVa?j(uo7O?+x$h3KKUfCrl&0??a`+6MSO_9*nR{nlAl?5zWB3&`# z2K(z9uD{?}ICwTaqmbk5{cN#Z@-=1go4M@Y=HI_@@I3DeaoSD=3m4QPWNGVfhZNZwIi(`PzH(X*NNkl<^G0@$K`S&Z8ANs?_Y4Ng@nH$cK#fI zM0X0v(S;nc8`YySlJz)1RRUhonV@kIaX7j0v$Lka^fs^O@4Xv{7!BN_{6-1Cu>=!O&7)4$5A?nAua6W{3+d3IO}g1%5)XK*Nt^}NB~kQ!#yQ`wlrrq z>x@Z>sisB_NM_RaZ8aFn^3e5*fzKJlw79sqxr2}mAR3(cnF5VPRb@b`CtOJ5@bOiAC7=1)zHHgbHM5&@{W@vNun3U7&mgJwO zj?B8s_RzbZlUZk#mk)9LoG2w)voFwEoM7pya%;*`MtS?~3QVmL%2sI8`23!0M3zyv zaKwW!E0dJwD_C~FoPGtHrthI9Da$&PjcE>%Q z(y;W=Fn29)kI`jmBd@M)zIaPdauq7&lmMfo0A_b#(gtBqDS7G;PZ0zD_-eGyDtPX5 zG+ekN?lR@t2c$o|-;FO1&e5yi_KSDCUk`mp*da1xvA7y$Jb(7sMVI~4`MmJ1KzoSm zO_Bbida7XKZEt*|%ye^Yy(Q0bsSppy^S?ZCv@2mg?rO&B_w< z!_ifUI~*xEqsBXhOg5KXNGiZ=+|b6*bEn0y^XBr!6d>$wd69a!WgUw0KYtSzU_IGT z>|U+wf6904w(2WymU=7DWUT9H{hnWoCX>$vZ?x){Vr$B<&HsJga$!5XdT%OKZ>M?_ z_$AZLp?x>S@?Q8j#;qsi-plHB*mp8|H>n8*aM~@nPB~eeeT;riM$o%cRW;YpGqNcv zgjD*a0jPi{PDIV5q|_JIrnzp2XisYRY@?@I2N=DX6yyj}+FkBh z;yC7bFTUfR-*x3+Y}{PInu-O5RQQ7|PSlXP7&4Xe3tX5;qN%jZ-7^8WI}kOPO2NsF z%8kI=aqk)JY);upCUEa2?`H?N$Q@^8O#9vgOTeT7xgMMmdw^Dt(Je!+knfUNUSKrO z_6(YYOn{i1fpg-YWGhw^%LR*-x}q|aL&X%$A$e{50@J0})o$Ji<^t4I28prKOkmk#)ci$!JdN-M8ON7$)&hp0}??1 z&qA3lg#xeJsg{TLc}IufF`>(>lE%YPBE6)HyBPh(ZEv&_0GupG*)7O+Z&WLE<=^bZ zW&l^WQL98Va?|q`nvRWjI5UG_I*>kjpNt(I&jtGx>AX&*P?jv1Q&b%j&%gTFnsq-Cb^vUnye( z2i@XEvPSBLrWA)ogn~kXK@7c|&6mjsN+fxunWK4Gh-9S^=w$agV2*!Q{n#zvRLD9Z zQAIj!jHoQ%W+9=r1UsQaQl?CZB^Z(Me~6I`KtM5(4w}OscJQKEZg%6>;%rBBb!cr$7 zVCS@_t9eIF(e~}=%nVIj{DuNe*a49bO`^qK1$ z!?)kZhOVtlcsoDhG=jo0z;~WHNW0fH(Gg7v&VSodVTTeo_=9@7a<_5W;3Y^x)IdAZ zjmVS2{kPiF@+m z!3?glQ=Zj!G5EmV9ousT1SB=_hY;Aa<;?Mv_PkJgPltA%h@XJ`y z?}CHNh%3@**}+e<@8~kLt`V}Cd>8|x%5k9kc_Ks9q(r1l5T8~XqXzr8^A0Xdpl7JI z;<-cCti%f?rB2w)=vAP8wg@Gy+D99u#PUjTp`4mN==m*jmeE zxxvT}RFKThf(dHHA;m?!xhCjF501^syop46aEqgTUEeBVCAR+|64wI4mkIdA?nh|6 zp_nt&{CIuq)zA&mRK8>zHE(4OtiO?zT9OnJ2j@~OKR8RLjcS1gpN*9uRG9q0{3kZI zuV*1TT5J~VOh@$EQ534P8U#KGP^I21zj8}TR#fOd`YXYKJAVQ>T!H&;C_33DO`%Xn zdrnGaf8sU6wb>M1)H9gTn9E3WBO?lfM9na&MF6wNOajS#9-u<#P029?YJDtXH{W0E zkfdU@R0qm5+WnkQCx(Xyq@^29PEf4S;jO~h%a70}Hzjo|$r0Q9ORvID;k+z#W99G+ z53jlVOE0ET-W#8f*UI1SuAU;zlFpcM;-#$;o|tw>HVZn!Ie4UI>B0Dx-;6+c95?|6 z#x}sZLGf$Fu_(_?+v^qZB&qmTMMr93chW=3TC=+9CZ!9UN31wMJihYZjZj8s=y=?> zYJtQ)W0rqhw`%Xed^({VspOX4^SnW_I^X$1WUP7Tk$EK#vLuw>b(tv?`ASR=7LkQN z%|Xw=3C_YoN^K|1Oqa{@q<6XWdexR^+&thg>V!~P*VDc_Foz6ur2YECcl-IY>U!_- zDFx8u*=3-{Hmt=fBOf|M2zUsJpo9>Z_9e=jJ6$h(S#Mr-O*4K#Fd9WIB;^}5!_;* z1pi*u5nE9ZdDHB45A9+6N^xq2ssh&Pagu{?Tzo!@@Ck3GFYJ?w7dxl=$d|8NJy|Vk z0@H++{W%#5zsjGh{R@OEOtnAno1k=p?I1e7nEOxL^(jdK)pF%i3@&CQ(c{BP&hZ`z zA!Q=OG(39#;wg&nL;HK??Jo`%gCTW@A|#-i1?|f=_8C!Z1Bg!AFMO(8!2O|a;dS{* z4TK{Jh%gW8#?k92KG*?cLi^#@2Oqn|9b;7%(aagr&4Iu$jEm){po8&<4ONE|IXpAZ z!Pt}?-A)m3?b$(TOz8hsiW`kf}?#^-ECCGiO_L?7SRYtJnmN?jj@;dFK$Ebf+IrdK=-2nOkXl?_9Ee^}#+Za6KKRpYpCw-fHkZm) z&<^mmEh{bkRFYGXiLUid;Zh%p661#eem5V*+d;=tkV>7;uaq;_9W_ZBkR6PSZ=SN# zN5%l(nU(-c1wHAcu8QV|FD;Fl6Wz_JxO#F%^Cj}(=J=AZ*l!xdFnZ4-3_X?ya#E#m zkIZX1scItLGG?;!wk0G2f_1C?*%jxhmh(Afc9F8tRy20xBXbJ`-op}*muKC$dB2He z;^Jt=vXdGp$EMn%Wu*u&4)&(Hlkq91)|mjeKV3C~N|y~w=fsSwCKqfi9w*KhY{fXE zH}%Wn=K{Z|SZLOl1I3-eFVRv+armw*z786p*kgXM&;%)D3C3rV@5>Y4V*zIv=axM? z4E(Qfk6+z%1I8l}(}=45U(P1wu37Ujys_}sCC z|A^QSNlFbwXbpb9os->t5)l3U#ul*X{#fpYb(8X{cZq20kew*i49bcxgC?f|S>U(J zc0nQUO zQrM$+(zQjbbNHW=V|eaHAJdS*6mIW5+|@tX$ziNJTec*{gZ(7Hf$bIS^ag}KCl%R7 zM-o-58UnDVH~L%siTYf>Uj5|u8b2ASf<^q~iGB3=d=xt2kbAKb>0NOq^maw>Q5A?_ zO0cG2nnHF>1Gz^666}_*Nq`jKT(Is?xEXMJ_dj-c^~IVQ5Tq42H(LqirhRZH&{V-xxD=$O>Scm0g5tC@%hrbO)S>NN>SsgL6EQSg#1|GnRf#-d5J|uu|IZi z6#IANl~y6Flq0?E^2a$*c8sH;JzZ_T8sp0dL4(5*RA_9v*!)_L6#$TE0@8N*!rhiW zO+Q$F-ngl|Sr10~LNlg=opRwOlde~w&CFtU@iwIR(rofByfkoiFFd|gF$wD z!bimqb7>C_(H^V(SO?rZ_`UCbY*E7FK&zmEE>u!JluRa4aU~m4);@5S`Hzk&Hu&pL zD0E~~-sfGE6&i^Y@3)|yTFt`3*=`m$y^B>iNytt7<`+6dw`&}pFQJ4Uss{b3fsQJS z(}@vkkf3|SyXPj4<}{oFjd>#3zA>Mr0Kd@5ZR9}L%Umk!3Zjc^kYHd}(_FICN zdW}w|sl3HV3A9xlih)C4ND8`IqcTxR5sUdgtw_Fz4#cC%Kioq&f}_?@BUHB=@!xhr z`ELR<@E;1}Hxp^MQP-YOa z(Eey5TXW+!6FAJ-7P-xfl1U%U$3i6k0z$oG;C>*zI)WAK`;e_LK8C>zdq{wnwWBl z)M{RA69Q4B47;~muZO_Gp-&&F&wnTZ6n5f&nGT6p`996bwYh1XXYkksgRU8LH$Dm^ zdFeBM0->LV5f@|r}!jnlJMieF#@{kS|>nzfpEo`>4WW?wh_Zc%zFZZgJ6Ve zvf~9sJ!pheQMGQuYCV4ztv;@jNodQFYvobJP&rpER{wHE9*SQ@)Gq`I`ExA8!QFLy zn?pN&zZWyzc;64#Zhn?|Cwc!-ZRDtn1q0oZfM$@7C=nu8MYP8d05%fHl&l3xUuE|629ec(eP&1M{F<`s4=c2tOhwUJ>CYqPlz3XxMlZi! zrBflMYt-$sbB*h(HB7etHHJ(~!4Stf|G0M0ZEed5YTf#or2FB-0r0qhpr}Rn)8d_^ z(%^AD25E03)#;;I9E#eldG`0aO1ho>*UCjQG`~c4k(YsA1gr0!)*V_PlaOtv$`*M} zJ>+IpV&kp*i1=oZbuL%%4GzcDPR!bICatBVreHA35LA5_0p$h3iU?#SL zguxShx#}~fP6IG2w-zhxM{>Ah5#P!SUW67#xPNMA z16DSrl7CG3*;CZBg>f^=0pt{HbrO>_^sw+;kG6%~f$8ce0ktq<^v>+_mr(p0%Z#w~)<8>B?C$h3+oLr7!npd&g5N8hk zAfcEbQ~bb@zh~?ez^t+~sd;D}Xb?Ob`WXg~b(^>AtZUSI$_~XZ-8Lo@%08qgXYyT5 zrLPjc|B2FM`{ms}E>oa zQeXwVn`>*o%qKPtONX7Ob1?O0>Jr(XnHS3$nwr^Bmr3~h^E-VE>y%2K;>eO| zY`&K^gKlKu*Xh&n_Xf^Ojq3bA3tg@FwxHX|*Zkw1OBHPDLR2M?aJZ+iH+()w2joAr zAqi2qeslHRLcq^zs03-ZnmPL|T7Be1{!(H}Z=2rojRXP;RqqjclIZ>QUef2Das4qd zIWU#W&s&DPmKGXI-EfGpyxYkYy&OO8 zx9~O$ypd-vbUz|SZ>{hN3Z)Y0Js?zQIRIP;0|~yDi0K6dPYL87WS|6i27q6p+aklG z{EK%zqF{m>gZ`;304*>yU`-e-8e=}7QWy*p)ad^d1P%+*0w2Y~5CRD?N_FRgz#*)K zivM=d)EjV$jj((EwoWbDc1Vr9x2C!^+!F!nyui}PfazOpq5II?S(FRWXHF&Wm7?)wO z@X)!~fjGQ8olEl(`Z~vKoD90Uf{8EIbll@QGG!G<@f=9Kx{AaTy|>xFia$?weIw(@ zFF(utQ>Q)In4I6$G7;f-@LY&vV^2Tir4X3mZFh1gf4Obi$`kzI0YufT8%!BFc}iH!OQAP_wy2=uQMEG#VS zKT@!wp#Nxyf5$FnuC7-07A_2)cDCz)j;_lN2ZsMe&8X+|i~uTeihMt$J24!dxwHtx ziu()2DMV?!8{ZH7{+^nza$`aA_&9Dn`y{B^&)o$D1untk(={Z#o?s-@*TtHGm0mEt zeuz{#99<>KEzakD_HV9{32=9LXt_k;z3SpYD&F7tX2#oW>4-SHv@W4PNt*=&38-I1 zpOB&hYLeL(EjT~b?~l?JytW-pCVsPW7qX_x{}dR7 zR$ZfAau=_7*hn?zeE;k%=8OKDPRpJS?X^^cw~XP#a59<1OuTJk?OUvIp&4NVk*hct zQdECxn{J1JOq1??6z9s^fDUUsKvvUKAD)EM$e_AUw@ITWY-zhkOu)gy!7sn!na2b) z5Hi}V$J%r&TVc##3Q1slRfJok9fc>-*0{Ml`TA?G4?m&06H(A0yzUjcYY@J9;FfAr z_;&g0Fd_j6t~}!yA5tfORFz+4r1IhS!8%21e?r}y4#+H8`k+UVej4Zmuxul!lV*~) znxgf!taqYvg%yjRmjj5%Scunbm(||{|bsn_@IfHi44pzb)O^$#joe4O^BxD*f+jNB;7y4-rD8E>1 zTGvyEr4Zq0*14tYva63qb1r8+*31=)F-@tE5WS-l_SN1G6wmI{{h1CPkM%E}+}b!iKKf4pLcS8$UMqBr^mWoeJxt8SN54RK$BLvP1zb&D+ct&ac-7(9AnNyX z;+l7KX5THG6=AeAR_G;O2(Q>VbJ2T9xN=WjD{j;%az~)BXFi6s+4Bc+btLJFA{~#~ z(f62WdOrSp7jGiLk54vW{_=3;EZ?`oKaIFo^2DNvQTprv@S<}sY*`)g#cMVjDPNZs zd2i07Y9ceWU7(XQnMjyb)7?w!=OUkfmDzp5h#@)L>6Tf3#WcVgN`(fys-b@9`teD;SV2U{>& ze6X-CdD6`Xd|zaF8<2(!g)f`uEd(OkYD_f0=qpmJry=jKLU1DOxCJ3!<>=4%oZ$27 zt`|wW=DN-Ok(=pI)BeK*1!s@WXw8-BI*X1R?0-={ki`^D1<~S-t4w)~hf+>Z*2G&^ zB>ssH94@Y5vbQl-e;q8oE`YLoVNJ%R(ey1PBTQN+QISq1%Vimr~E)_T~BxGq;(w1$s#_i#ewnm1*s&$pWS0WI$IUJIaB(rPe|KopE)q=byhEnfoT;jJN}>jtKHv2>8RB0 z1ms^hy2sId(t{SUDrzGGQeW-+7@_Z z3+KP`MgNd;O-6|i4r@9krRne9MXx`OOFkKrPXz8X^}o1-pG(hSZx6S5x8^)YzwX z)GtQpiWcsz(m6ywBaIC)gh%P8AdlOKKfBjF+F@cT7e~ZCe2X3Ux@O6z?@EodH-k!k zY6*}LZ_<(GMXb$$P{xlXxN@)^-cl|$x`?I=#9KedpdhSXu`u@UYp_0%DtJ$WkKzj9 zG3;(Aq1IOwCBQLZv!5e1SSFc^vkK3>OMtxlzQ_C-B4t)hEv*u_Sou0j4L?94n#)Rz z?t?Db(t~ZeXeG$>gv|71fykOPR86(?QG;0`cR+zhUR+$nl>pisp zY*tqakG^7CxGvm4<&-$jHg~(}hKF6&H45fd+djJ>WmSb&YU{Lg;cg;clyG!T;IV9$ zc~E$m-ifk_BA!Km%Bq!HPC3Nb7ku&?j#`?MhyzO1QR38!E9O+1P2u{4vxwR1TNQAv z6a8X+DUTTrqS$)U0clLXHS5{YSf6S)hQL5={G1hUohR3DVum)~2$|6kGH&fTLCLLN zdp32o@iSbv_CPfZt6=-^maL}pUCw*scxHaR`Rz@_;Idnbkwz#wc5y?hlgVC8_ni_Z zY(9c-EW$rUJl>d3W}%G?JKab>DI7Q<{Vc}cyzhtGIj(5enef?~r(#&UE$^NtlR9?Q zo@ZP~-a@-IePp-Y^RqeWr#LM46{*x(=~Q{>JHHBwdw436v2WN$^w7lXj+TVKZ`h&) zi-JT?nIbJ}=K;L~alS61Q&@Ykn=1`lv|yYF8tObWpX8#Jd%kZLE=H+Vse3>XOA^f5 zL*t`yw#F7YWBsiuBs7n7-2V#J{+%JFFK+#>sq;# zUt3!P3cKWGW*I>et~4J=l~z1DgX88Dbps<&rr9ZkADu^&vA70qTRWp{*9~5h`p4S|FxpIz%j>;OVuF)C zuxrad^TXXd3DMV!!)c{?;=Cbs059}<;^@0-OuK4&sE&Of({95COWI|ZvxCi;>FC71 z_a?hFG8+|p4WFaeMlR2%^z8uar(C8=CHGatd}`%zuy(ZI(iZ|rQW}6ie>0iW)4sSj;LuG(`Rd$6BRy2ARdx3#>%W_If8dcvB7^iC%!Y*mYgWiCAVFA5nN!ZvM6 zX*DggBB~zT-odf)`Y{00>!zY_`s2-T@-Q)j$~4gq^6kqu(mb0$fZ=TJRbON38-MNm z%gd1b?>)c!z$UBgk(@2&vIp6+6hB4p5W-6w?@>)sX-9PVIlA(s%WF0Yp~EOhqp#^|8#H zi_@ufiXX&&x&s!V1#u4$jut{Ab->U5`KzsZk@fQaFoE2Y2XNZO>5s=8#gm+mtDdBL z&6m~AGUaC5CDB~(w=-wf`i=Z!bCGjzAJeDQU(O6u-g2kfi46Iq9Vw=m;h6pj{ROSb zHpY7$3l{vWPRT`SKlH5YMXlYkoPW_;{N$1b*i!CO9$&cqbAiaU;vc0HgtJy!-%&nl3-ce^Al%S;b`h67M9=k}1IOkE- zqXQ&Xl!g8r@5iuV8Y<~aq-Git;^vV{L&py}LK!C~07Bf}zRjcr&$zZl4~wU}^`YZ! zx4{H^zyfL`_%(99vcAG__XHDoY8%E>fgmnRF)=U?RBLxd=UQiRZndP0@tre1X~ANZ ziLbOVNh0dYv>m~2jY5cFmc~S3O~QkwF8H3d!KEWG1WX8g_Qqk$fnVyeZaf{kl4VQr zt|>QD_-6d_1e&YqX8l(4VshXW=MaCp8%JW-i2=yhI6Jcu)*%x3du3rBvR)4?Eh;+e zb}5`k`c>b88*X1tO8^GRMIR;VRzE-rD+)EU;+6KKM(}Nu4{T&lG!e`3=|#}*h3LLz ze4%}`>dx6Dl1z1_Tbhe2cC%!tw6m&{#1+ph{%%sz36)VN+utU2Y?FN3`zzSdH&KC| zHK6k}&p$usUDdV8U`nnF(L;@UO~HeRCa**VZdjo=Ugis=-7n%u$cZcw4lSA1wL$Xb zQSwu4ifvtrK5PkC{PVW+VV5g>FKj#87)O|RA%bQu(u1qf%TMEY0WoW9&n$YC-N{56 zwtn2S-OX#$5jnOm*zP=N`99zfaLSWENB}5+T`c~>5o%EDx9Epw2(&(|ICKaLR30o$ zznxQC2bkWJ9emvSGND@slMJ&9eW?#2v0vBZfpZ2&mYzO8WSTDobj9NisX?U2%mXa` zH>K4lqw1Pr)luQ}mu=_vkq@QUFy-->9&xgh0mYAr!52qu{K@=6%keFhKNN6L{lIgh zJwjakT{xsj6IGo+GQfK-(l>(h_ZP$nmUus^In-_M@-HOWvD-C4^Za3e1FUhex_9)p zq~+4JDQ3Wa3qMv;an2H{eln5Z2&_m6DEO>Xj-lZG{*LzM`KHCCTi;Jl+lSndk3L0M zDppS-^bYTEia|xUQ_H!pau~}Y9*_w!>?}%|a_%&zVHjWu;jU$1KcIKitMqc1cS}9* z3XJ~cLpI{&uvhyak(!JAskfG66loM6-O$q^YYGpVd&Wk{@W+k2{Mu`OqNLN*

as{$i@#RB3aKUk02iZ3#eqCg~bmvHQj zvn2{64E7MjTWeE7a6FbRms`g&jMu~tM%K~ZTBV?0yYJd1v4>cUB|7R7S2F- ze9Gh2X9`p&%a5+Hb*}AMg}I7pR{_JS**(Ji9);znl9>e#5=HLKP^?F30Zp{9)L{0I zt22f|LOdsw?8tUuR?R!MHo#Drz83xi{w1?k<+?(peps&{@Y#uI-gNB>S{dE3G+G{w z=wziEgh#!4%IvPvY>{jGg-l+bf@M~0xCqiopal(y$rmMPs*(*UV*h4qZEGI;kk6dQ zUGh!p6CTP;jI3g5cHABQPMY~B>lCWUh#Z>p=L&f9AHf~SWUI?twZJZSeyTmw-OSq7 zYH)x>U~k*p?P6`w1Jm%G@_~TkjKVCHqpQa^o;AuhtP-zd-j*miR-)2#j8D=90cxw_ z9K)&7uyG8r@TTv+J8hIJy#mZ7tI&$ES?1v?oiehP&3^CCQZ>mXD(R_On~)8I z+rtR#OQ=A#fa}urww@{74&(D8xKs@wbwr@+ZgdktPK3>aY(ka9q^ws>vinMr zV*9GrohFMa@ZGCVBZv3aMi8AzTX0P~E`^V!lq%ILDOZZcddFj5g!nw{Uzol`PBK|w zy6ZP!jT>V+5&_G2Psuq$Ew{O$DDL2zT3Cs-CB|#xg|Wvti#7K}u{s)XHb-RN8d2eI zaYvuu{I@voVst-+W*pY96fF7vy7_Iox~tGUz*euH#3EE86wcGoW_EqZWpXl+`v`5K z`mi=ejC5Ef=S>Ob+YmnjF*mGBJkiF)lp~J3e@MNmeGU{w73&tn%(P2)x=yA8ncOU) zi(_f_-;ARB3myvZgd@-DK$sbl`%_j+jZfrTTaDWdE;J*Pzs;ohXQcSKq>dLlqIt?} z0>dsKdCGj$bL$j2F9OCHUvx%kGXM$O?tz6;C#ZQ>+NC$Oy_8no7%ZL@KBmi{<6;$f zvPPv|8-S+;E`LITg?(f4VDLdK3gMF5AKcssm$f!{VvE~91E-NJ#`YkIIdyknq;f<5 zHMDMBUnJPs&}--E3ewYW@P2T*Vm9M+g73E|!3}BS1Qo~y zaj`YNO_`cMMcxEwa=b_v#@r7d?({dtcMY1;31LFweuXgXAch7ftvJhWgSrKU9}1vH z>oW<{aKzM2850u2Ukp}1Mqres4YzZqM7B?(1lPq;LW6!$hg4t=Gql7UD6MJGqMr?AawqSXV=ET>9ny;(INUpl+8FwWW4pT}&_SQ$$IIxawR?~QZM$D* zpM{homao&*j~79n+Bg$J#WfI%=|$=8C2;(X5>BFn+GgxQhp#`@yKv9lYGokQs{>9x zUZY<;ZziQ7@OkJ7InOp_CvF$!IMDu-cfu5Y$oRC?!cOqD{AQsOXnBA47{|`ZZm>iq zsuE1oWVD(Pp7!nOS-$#X{}d%4*&eknX7k&);9KMaj)yFuoa)&Rj^{GmCU3Qs1Q^m2 zLHRHJBAFtAM)Y0W{W@S;mdSJm^Ft}Ym`{1v{Gg0gb6#|N3o;VFp0YVbpZ7BEJKBxj zYQddm)Z7$-pE9-kEs3`;3k*C=)zZFBMn-n9-(3=#S`U*4ZVTVX06A|Pts3QLh2YGU ze1fK^Y9VA+Lwns;5H~OEYj03e4B)F+?W5v%*LiMAF11IUcYTz3@1H8#J~xGbD~5NB z#gEFky?;)a4yG`t5JKkhkO@5tI98;w+&w;fXuqIQxoZA6{JD zxSQm47Mn9>r+4i+@iKw^rnQ7U5v+H?7k4HTcPC6g7mkmBymn2YtgMHU10v}zBLq=BK=aA+!O;3w|ht*^8?FLyi4JX8Lvs} z^ISs{bISoeT?bHp!d$h8M!3GB8W`+X!?u~&`>Ax*1@XhEGM?6k2s$Brlj_`UYP|q? zpBX_;-Q!)#I9Bt6y3goKqUOih^uhYa!Bw@?ow*U0 zs{f!C#?Kr|LTf<-KDO77>!lCye{dD01_l!WG!Q7)|9^0mhGfQV=1Hu1J$^WP1e{6>ygz(>Te@D!J$&smpy{nnM>;J)KLaZPj zK`Gl`?XF(7X8$Dc|JMC)AK(k&fyeVFa0}5B{~O+e|Ca^I|IN}Ae?kl&bpnzQ?7w}L UVD(q_i$Fq{5GAy?;6E1sFN1sRY5)KL diff --git a/statemachine.py b/statemachine.py index f6b45dd..0fc24bd 100644 --- a/statemachine.py +++ b/statemachine.py @@ -79,6 +79,8 @@ class StateMachine(): def handle_wakeup_event(self): if self._nerver is not None: return self._nerver.nerv() + def on_leave(self): + pass def pins(self): return self.state_machine.pins def old_pins(self): @@ -144,17 +146,13 @@ class StateMachine(): for cb in self.callbacks: if cb is not None: cb(s) - def handle_pins_event(self): - # overriding superclass as we need to do notification (TODO can this be done better? on_leave?) - if not self.pins().door_locked: - self.notify(True) - return StateMachine.StateAboutToOpen(self.state_machine) + def on_leave(self): + self.notify(not self.pins().door_locked) def handle_cmd_unlock_event(self,callback): # TODO: 202 notification also here if possible self.callbacks.append(callback) def could_not_open(self): logger.critical("StateMachine: Couldn't open door after %d tries. Going back to StateZu." % OPEN_REPEAT_NUMBER) - self.notify(False) return StateMachine.StateZu(self.state_machine) class AbstractStateWhereUnlockingIsRedundant(AbstractUnlockedState): @@ -174,7 +172,8 @@ class StateMachine(): class StateAuf(AbstractStateWhereUnlockingIsRedundant): def __init__(self,sm): - super().__init__(sm) + nervlist = [(24*60*60, lambda: logger.critical("Space is now open for 24h. Is everything all right?"))] + super().__init__(sm, nervlist) self.last_buzzed = None def handle_pins_event(self): pins = self.pins() @@ -249,6 +248,7 @@ class StateMachine(): newstate = self.current_state.handle_event(cmd,arg) # returns None or an instance of the new state self.old_pins = self.pins while newstate is not None: + self.current_state.on_leave() logger.debug("StateMachine: Doing state transition %s -> %s" % (self.current_state.__class__.__name__, newstate.__class__.__name__)) self.current_state = newstate newstate = self.current_state.handle_event(StateMachine.CMD_PINS, self.pins) -- 2.30.2