From ded541a8edc58a8e2c68fa7fa19f0d1d020bb450 Mon Sep 17 00:00:00 2001
From: shinedday <shinedday@gmail.com>
Date: Wed, 1 Jun 2022 10:37:24 +0200
Subject: [PATCH] Version : IoTAMAK-0.0.6

MQTT client : now need to specify broker username and password.

SSh client / Amas : now need the path for the iotamak folder

Scheduler / Amas /env / Agent init args changed.

Communicating agent :
 * fix a lot of bug related to sending/receiving mails
 * improve interface to manage the mailbox
---
 README.md                           |  56 +++++++++++++++-------------
 dist/iotAmak-0.0.6-py3-none-any.whl | Bin 0 -> 13205 bytes
 iotAmak/agent.py                    |  11 +++---
 iotAmak/amas.py                     |  36 +++++++++---------
 iotAmak/communicating_agent.py      |  32 ++++++++++++++--
 iotAmak/environment.py              |   4 +-
 iotAmak/scheduler.py                |   6 +--
 iotAmak/tool/confi_reader.py        |   4 +-
 iotAmak/tool/mail.py                |   3 ++
 iotAmak/tool/mqtt_client.py         |   4 +-
 iotAmak/tool/schedulable.py         |   5 +--
 iotAmak/tool/ssh_client.py          |  22 ++++++-----
 setup.py                            |   2 +-
 13 files changed, 112 insertions(+), 73 deletions(-)
 create mode 100644 dist/iotAmak-0.0.6-py3-none-any.whl

diff --git a/README.md b/README.md
index ac081d1..cbd743f 100644
--- a/README.md
+++ b/README.md
@@ -25,47 +25,53 @@
   - [**Bibliography**](#bibliography)
 
 
-## **Definition**
+## **Introduction**
+
+### **Definition**
 
 MAS (multi-agent system):
 > A multi-agent system (MAS or "self-organized system") is a computerized system composed of multiple interacting intelligent agents.
 > Multi-agent systems can solve problems that are difficult or impossible for an individual agent or a monolithic system to solve.
 > Intelligence may include methodic, functional, procedural approaches, algorithmic search or reinforcement learning.
 
-## **Goal**
 
-### **Subject**
+### **Context**
 
-> The goal of this project is to produce a wab-app to supervise remotly experiments distributed on multiple device for researcher in MAS of the IRIT. The application need to give in real time information to the user of the state of each devise / agent (activity, result..). The general architecture  of the system is in 3 part :  
->  1. Some devises that can work (Raspberry pi 3b)
->  2. A control device collecting information (server)
->  3. An application that can show the server information according to the user need.  
-> 
-> This project will be focused on the devedloppement of a system that can distribute a SMA defnie by AMAK on multiple raspberry PI. Once distributed, the server can start and stop the experiment. The 2nd goal of this project is to build a network architecure between those raspberry so each Agent can communicate between them and with the manager.
+The SMAC team in Irit developed a tool called Amak that help scientist to develop MAS system in Java.
+The wished to extend the tool in multiple programing language, 
+last year I participated in the conception and development of Py-AMAK (Python) during my internship,
+an extension of AMAK (Java). Other version of AMAK exist in C# and C++.
 
-### **Context**
+This year the goal of the internship is to develop IoTAMAK, that will extend the application of Py-AMAK to use network and multiple device. 
 
-Last year I participated in the conception and development of Py-AMAK (Python) during my internship, an extention of AMAK (Java) a framework that helps developper to produce MAS system and visualize the result. 
+### **Problem and objective**
 
-This year the goal of the intership is to developp IoTAMAK, that will extend the application of Py-AMAK to use network and multiple device. 
+So far all Amak system can only be used to simulate MAS system, but they canno't be use with an agent that would exist in our world.
+IoTAMAK goal to connect any devices to the system as agent(s) and use the network to communicate. 
 
-Notable diference between IoTAMAK and Py-AMAK on the interface :  
+Notable difference between IoTAMAK and Py-AMAK on the interface :  
  * The structure need to be done in a more pythonic way (no getter/setter, no public/private attribute)
  * The UI need to be a web app powered by a server
 
-### **Constraint**
-
-**Language :** Python
+> The goal of this project is to produce a wab-app to supervise remotely experiments distributed on multiple device for researcher in MAS of the IRIT. The application need to give in real time information to the user of the state of each devise / agent (activity, result..). The general architecture  of the system is in 3 part :  
+>  1. Some devises that can work (Raspberry pi 3b)
+>  2. A control device collecting information (server)
+>  3. An application that can show the server information according to the user need.  
+> 
+> This project will be focused on the development of a system that can distribute a SMA define by AMAK on multiple raspberry PI. Once distributed, the server can start and stop the experiment. The 2nd goal of this project is to build a network architecure between those raspberry so each Agent can communicate between them and with the manager.
 
-The system need to follow MVC design patern, this mean that the core could work on his own, and a UI is not require. 
+Constraint : 
+ * Communication between agent : MQTT 
+ * Language : Python
+ * Follow the MVC patern to separate the UI with the core system, this mean that the core could work on his own, and a UI is not require. 
 
-## **Solution**
+### **Solution**
 
-The project will be splited into 2 parts :
+The project will be split into 2 parts :
  * IoTAMAK-core : a python module (that can be easily installed with pip) that provide all the basic method required to build a MAS experiment
- * IoTAMAK UI : a django based server that can interact with any experiment developped with IoTAMAK-core.
+ * IoTAMAK UI : a django based server that can interact with any experiment developed with IoTAMAK-core.
 
-## **Project managment** 
+### **Project management** 
 
 Meeting : weekly
 
@@ -78,14 +84,14 @@ Tool :
 
 ### **IoTAMAK core**
 
-The classes that the developper will interact with (Agent / Amas / Environment) need to be very similar to the Py-AMAK one, this is why the class looks very similar. 
+The classes that the developer will interact with (Agent / Amas / Environment) need to be very similar to the Py-AMAK one, this is why the class looks very similar. 
 
 #### **Code structure** :
 
-In AMAK a SMA is composed of 4 main strucure : 
- * Scheduler : it's role is to make sure that everything is working in the right order, it's also play a huge role with the interface between the UI and the experiment, being able to pause it, or closing everyting.
+In AMAK a SMA is composed of 4 main structure : 
+ * Scheduler : it's a role is to make sure that everything is working in the right order, it's also play a huge role with the interface between the UI and the experiment, being able to pause it, or closing everyting.
  * Agent : an agent can have various comportment that need to be define
- * Amas : it's a superstructure, above the agents that provide conviniant way to add, remove or make communication between agents
+ * Amas : it's a superstructure, above the agents that provide convenient way to add, remove or make communication between agents
  * Environment : a place where the agent live.
 
 ```mermaid
diff --git a/dist/iotAmak-0.0.6-py3-none-any.whl b/dist/iotAmak-0.0.6-py3-none-any.whl
new file mode 100644
index 0000000000000000000000000000000000000000..1d9c5e36f46469723f6d11e3db73b8d1dd968ae9
GIT binary patch
literal 13205
zcmWIWW@Zs#U|`^2kjP&h!oa}5zyu-~7#M^Z7#K41OB{0(v-RWSGxIV_;^XxSDw!D&
zT7ta~g>b~@?n`B1VEE6+z#xF6B{4lUuSBn)a%=eg{>5ejb^TNRCm!*3Jif6!KXl3J
zEm^Dgees+6?p~O7$^p)IRuVVUHs4<LzdD_VjoH&|)jAuMgY)F?*ZfOU2o%XR|IU6d
zLPOP<?VHo5w`z-03v;G!`>;IlY{lZp;FXWdHeY|maVA3I+R_a%#xp;stF_1ezSZ^Y
z0dJk)Qs0N=iEqk`-Hg|#{kdxt?HzbQPcOY>cIUBz+{gTy6008{RQk=l|FMnwlFE4t
zmb(4$begBPG2q+36Z4E#PdVcg`FYjkH52YQ|FqJbc)sj%_`8UX=Cdi=?=r;o@%#!j
zIBe_d#jM<ZV9Ec;kG4;CX0)9Be4}8ef8$H%a+m1Mi>-tz{tMRx^4_l$-^C=oh|A9M
zp7F|v)JKKJoUvSM=j}M>`ufnK;~CRrcl0hUwD(d|4_w%IgL_@Mg4C(z`5zAz8+A=O
zaJ?Wd_T!?rGygIyIP9ErV`BA;l4;KuR-G;mj9T({Ny*nTk$g#2<6SRwj0{B$u1QFJ
z{dI1|lo@spWNZF3$Txr1Nl=)YQ}{^vtEP)zxZqKTBX)kfRMcay?L3yZ>(G=a5t)_m
zf{SaPyHu1X`R~bIyv2OU?mgMp1*P=(N*9`R^;msuobs(B#>QqHPkc_@=2C_p*_o0C
zy57fbzc_dNOF(33Z{@X$(8n2~K3)4~h_33qZk8MFk@(6&E8bg%L)1)+t>5YF_E}e?
z0yPSLd)`>{T1CYCO^|%L3`<Gv>efc(?ORtpP+8K_#9aR{H9gSuOw-zr`&K%zK33Q%
z(0$IPMP!qa#;Peyp1zG=f(%awoyp}f`m1(f{>&*HFGD^bYb;tmx#^jz`1v_r7Z#Z?
z&REBOKR;nR!{Lv48G@%jEzJsZyqY=dgGa*Yt=(eNmfXCUeCKCEVXKr^hw!Nf-g_8g
ziZ6RwpF8|PP?*25@W=j39cQ%SR&jm3e)I2dd2#3LrO$h|>dN`vQJ>N2xazRO4~|;H
zP3Mc(%u2s^fwR&x!gb>YpOh00Z!(L6j$9Tv9GS5DPlAE#QY-7$+h=d?o^U1f+Uuk@
zO_|qc#=mrN5nsyvx&8P3y1$>^3ZAn(a88$hhT3t-S~)lWg`sOTWE;1yF70TTC2bQB
z*QX_(<9cz*Bc<v9ttB%4X#savHJN+vbyL>05(w_>et7Bp(kA&M<#Tk78NJndv}Vo0
zr8~j|PFl@Mj^uT`e|UT2ADa_%(wbI=s%tlOUOwp=zxD8jkG9W`^E~)Gbxp?S3ht!-
zELL%AIr)d%8~<7{g`AJc{<2%ObbjL08B@RgKhyOvT=RGG;)!4P%KQFzwR>UZo>8Fs
zp1*?0Blve&n!_1+&L4}zg>G#S-uF;A;@X}jC+*(H#p^FQl=HkeSoF~{$@=br`#++j
z-~O3>$3Bs9*Y1s`_Qo=Im^UA`;QYtB=8V7TKletrn|9ju2e&sc{hxZ~-XHgA{ysN8
zh&JkNjNg6e(W}?i(nW@Klf2!M-^Xu}xb^mtUFp%IXFc~n_dVu#yIaF+xutZLw&$em
zbJOD)+;1<tU@KAaozpJQ{67<-NNVvu6ylsb$M+!{1H&<K1_plQA}KeqSg)XRZN%-o
zJ7xm4<`3!>L>5d<aP|8XqVs^kwQB+EtwkN5pXsrzI}*EbnoHx7JvZ5Yen0m?DRBDN
zr6=re2w57>v6ML{qt&(OboYGeRUU!COZD`XWFGjcFH!riaWO9L&C(2x&{;b!&dOHH
zoV%GlYIkJqtBUFmO#6$M27lt#|MK)`g7@4jAMOOkUac|T<9%z|BFDrDrwYs-uT2U%
zo*%SmOV3=VZ{mOYKi8bkp7xy6!|U2B6-VF4?BY^MJI`+sC{>G8HaXort9iorx05CR
zBpkaoB_wd;ru8q^rNuohlZm<-a5bm*_U-t$OqxG0OnGtVX{+OOg$soV`m(8$&pu^s
zoPSVW{*bSv+MDE)-&D?5o-UntyzA=kDFKx)qzx9EaYQ)9?N_hwnwGnV>mQqBQSvsk
z)vUUqHazMJ4Q8D!3%X-G^Ygg~)~$|a)&{cfhij(v%o5`%bvt^tjVn#_Xv9uMnSeb9
z_kZ-^UA{PF-IHtY6~m)$8SGbCc4pV|xKC?V@_n%5inPl;<?ZL=nD%7Gn*J5l6E$W&
z$UWcCs3^xU(}SgQ^4YTbU6God29=9SM3<D9-aF|P_3iM^or>iTXLj!FT_ofctq}aE
zt)TIN>4Ek)ttv9xN`tJErgNPv6IyC7@L7U+`6b5Zsi#)eE$2E}&Qo-Z>DZIff>rDL
zzs&nOm!19or+v}4GH;5{{j8{ZUx(!d<J|MzY$+Qa-JNM)@L+p1%iFx{Mdu8&Zro<>
z&c1eQ?$<(pX7k`hrjEr?pX*mXTh#l!(#q?}J?4|wT<_K#-twfiSZMX8kMCb^-&vn{
zLwjB1`pxU^UyTVZbWuFIF0)blx#|=t2a~Qz8(eH3X+`mLPl?Z5QTOAw!Y%e|vvgV{
zv;u{6J2pqm?=U>pu})&+GezA6Nrz;#Ij^QQZB-SlHahy{OwnA;t&4we(OG-{qsHTl
z9?PBIcpq1>h}uxI!r54mJ3he6@YBqmNL_yI$dtBC??leJK6SjQTe|Gcm&r5g-b8Os
zZQygb;?(OHP=4kyn?7GS*Jk(Emsad+oaQ|{b<Yp+Mzb0GlP4sWo_ykDd!Xt4abA^G
zLbb6{`91uqYU--1l3DM6W-5EyC?0UYZxMTaw0WV@hZEL!^iNLVY7k0@lH0k-GfC>z
z#OtP0CJD2x(t5z3#`Wrot<LKHo~>yI)-4g6*KW<S?mJhe|K;nm${i%$?esNQ-dZBe
z>mBCIXJ>G@(O{3@#<ZrAld9TVHq7f2Q2csOP-C0-b05Ek=q<Lqx#H(p@{GCt`mIf~
ze{0Wtm%5uXC~KnA4u&-?ZRs<g2@AhIU3SdolaLm_PtDvec9BC*YHV^-PwKqY<-gH0
zCDHD@cL)0<)~JhVK_{L!6+3N+%%Ao;$~ph`n$7KjucJAf6=$*CvYGcfETq<bm++LW
z(_FkKYESt2`*=r8<nMj=5B`4h=AcK3Y;135C2JK+NO-Q)t?+NY=^68HPG-?<@LJH&
z%ed_9%foYKg>JeyXR-OQBRe(fI-EEZD%&pCt2M_tPHNUm%V5@NUNJBG@NsK9(I=J6
za<lHq@GbtnChctU-12QpKIcr3uKqnYGG+FJ@2fZOI9GNy>V-U)ZuE(wi9KbqCTk=t
zT;2%q>{MNSRc2L}-G&<ds>#9fnX+Q6{H*eM>iVt9Q+9q%+ctA~-IHf(E1tX-&|&@>
zCfENpXTtnO)^*))7o^@fFO=dRwUC)vJMNrqP4T&{pKUH@#LwRRihIWLz-J{<OwS~j
z+pa9j$t;_jI+JxlOttjAKUV2SlfRp#7{&6Jhj^#XbKUcALk@S>f=nr|;FZVo7~cke
zY4194^n1_0|316@9v#(J+FzRDT(jc&XZ=Xa;7$33;>mV*M9!rpEO;m8)-*wCL(GD<
zYknGQwKw<3ubTT}>F!wt?jrYR-9Gf=-?=^ZoZnA4=Y;WyH0^Qz@%HiU;!_g$qjvqM
zk(smk<cpf=fmUg+pDZdcuh{P!mbBeTuYliZ+v!PJvz%DG8XsJ~bMMmG<fk0sR(wxZ
zB%J6qxcbJb>&AM2kBntLsY!3A-aq7j&FSUe117WXSl+F;c2T(Q?+LH44xw`e>%XtB
zZ(6Mtlf<zp`Qkyl8UJ3Jo(Y&>a=^6lyQ62-#J>%~k`|U?rrD=z<ut_SyDhu@`0KXj
zN5AHtj#rpp`p7=~Lib(O(*aLpHwA@#sVbZ<weIOj$>`73B0ECnbj^BdUH0JqMfvDy
z2bA5qyJo1yy%L=E^L_96?!Aq(zMk3SvvAtGzpUr(ZhP^@_@UEj(T;`8K2_&79{SB<
z=Ba#a-+^=QT2`pv=VjM+KUHd@y?dT|%c_)bo2Pe$PTqVf^!m>my5XlU&r$u+uawxe
zwsX&$&#nLW7G1sm_PMd)%wH{@-~QTc>a9~>TX_A|f93#qo4()baLCg#o5{DB7#IrJ
z85rb{YQyCG+}zT<%;dz9%)In?SaW@9Xkhkj1A#jJC-yRRn^wO5RwxmrQG3_zrkuCo
zrqa%>rzTB&vh3!K`um>KgspwUUpeT^^((($``uG4c71PieAw!*UOkiN?F{SsWw5<^
zcU*4IyM{>iiyE!Yhf`YheU620f8Tn`k1xKp)bh^Czg1h~0y_@1>$Yslh^d;}T&mVP
zvx~iIdFWO_q19T-{>`USXWo}o;(q(i>RZeP-J8o<%Ik_AJ=ikM^?1viIr}c&XpdYk
zb#hH>_1)5DA>LvZQx}iJ^<nG69sDP$JXVNEyz?Z=&3V}Z%Qwen{<e6sqj8mx*N#<Q
zx~F{k&g8WB9lCKTeD=Yox;59ilC}O<>~Gk9ZGGy3Hy4%bnxrdgtah;)9Id{%d2&VB
ziri$E-b^8m-ChrrF35(lp3j&S^K*@--8+LD3n~tty1l8=@pJ2pZ4;Z4o*4uvTNdlI
z^Q~R#^8A(cg_rZI)l`daY+cb2)Ut85A*(^aj@e0jg%56!H8h?cCuKe%?OTv>TtSY>
z@>A^FcmA1_viy$AI__)VS5&+@>8F{s(RI37lX@gyd*<eR6+In8&eqrsDVkU2EDDHF
zt>8RlELuMGpFxesCI2qh7#3b@SxccmF9I&TOt@>q&c2tk#ZBw1^mAsWW#87RJ`KLi
zW_8+Bs7!f=$o@!O!LmbJAL?oRxbW5NY?ttq<C>=0Q+)pZc-*P2xJtX-BWBBrTOkJ>
zxP|MVw!C=nS?yLR`ZvHk@pkZEKT~}cn`Z08s51A5tF6n_O%81T8#^`YYtyO23WmGF
zitn=t?XJ%?{h0G*LoW0EKp*2>yt@vrFk16#&p}moM~yExf_L5W5dHji$@&f2Cl)ox
z-^jG$o6Ou3{(5H)_l+q|i@csIoqzC*ZC!e4n{vq+Q|s`>g@sO4cb8x1R{DJ~)HHkE
z;!}H*C0G0jxWeCTEq3JC#_N?=-u~CNF3-Ck6Cx*V=z9I<@`GQC3pSc6UU~lTXZCLH
z@86Feva4(S^Ijg2D?r`Wcgq4|OqduLgxMJw#E^1DYF=4pQGQ-7r1QEq#JhjCfxtfH
zkMeHsShIsK?RE27Dp!>gx^k~FvvWamPRi_*?fds7N9=jB@vU1I|AXV^_iH|HkW9|}
z6e_>ObeHqng+YgQnj|L1m+jpsS7*KW@gc6**?M|+H+O%I`w@21$oEpqw$B^REG^5Z
z{g%mk?)DqjiT@YWhl%utM2O6pFfFE7PDeW1YQnMlmq+ZrA6s!JRQFo5&{C(0k6%8Q
zYTsCLa)p#wVG1|L{Uw|iB$Bx%YkxfUIWsDm*;R4t7uSiFA!oT-?(!Zyl<TA+V^`Pq
z-tBRk8K-hmf_0j1xZ4%I?%Oq-dTVbk)=jY&n&jH@)cT8L_w%0pQkF-mm?yR5A2zq%
z%z3=$Gq*Z(sAD%@diX+#>vzwd$kwr4`YI#mZ~ZjMlRrF91b=?wm?~!XfuUc$!S(8=
z&3}%UtZ4{jy!pyz+tr<Cgr7M~+P$!3>QvRBWorHz*Sr5k$sd(#pSQ!kB0|);{$%o(
z6~0`m|2gz~&*>RXoit_I9(ga-*x80x+PAJ?+Oc9~{t5Qvnw$C4mo%o|%rLIcd16qv
z^^#-zK2uYfr9lBo4}`;-m;d47-?wz@x`R4av-Tgn+F$<ACFpC+MOEEG_4g}|S2}K=
zA+m5qltk>ERUJ;ds_XK?lH1GGp3a^iHOsO8EB`vR_3h>lj!%noyKu~ZZHs@%)=Bpc
zvDUuXym&%g<OPG2&-sT9bbcLtm3rIl)aFf}wI|HpRV^p)@aC9#xz|VQX3MD}uj<Sl
z7cbR&dxV!iy25AjendJ8@md@5<v`uHJ~jr13<(AXKBRP(nUSkkP<b~ZKL56vKt2D2
z_YNyqRTgfWvn5|LM#1~CnZtFq%y!#~MhEXLXWNu4Cv_#S`R(vm=5La9(4?=&Ctc2Y
zDW|5gp>~h;J=yy2%12v;B!#3d`f#OAIFeRcv0;PL-1AF?I4|Bl=&i`9@6LPHL-l%(
zKxIWiMSx}E4V{)#+nR2L>fX9?|Lu~Vb8FcJ+`px}>{L6&;;y`;m&>d7g^*pdMO=W}
zBMTN^*BzYB*)JC@Iy5KkhnkVo1`WX)$7I(6uMp8ye?_zRN{QZo=5<HlYWkeNi9T}-
zxc+J1j&~?|rc%rHV9VnFA0OX#s%<&9>B_N+iU|fhU-v|$I=;;f$!=2*<2*Qd5^GoT
zsg<3N9fY?@C{90bv~8<|Vv%}hlj#GsXBNuJCEin(HTmyd{6fR(+Zy!{yK6RD$1iTV
z^roj=rYX+-(nWnQ@nFtby-{qv8i#K!IcN4N<!YIklbp!$?1;SV%cg6lZ8A-cxVm0n
zUyXrF^T=;0<GW|wgZA~T?CU+{xi(0@&6G{lymIr7pujw){BQ3Lzg*q@J%8Qojnk9U
zwI|&%IaPUSar3?fAH7?qn+5K4R6ilTb6>-cm1b5S7I~V!Xl;Hbd9C@{(Hk2KA8vQv
zb~NDh6uq{?&NG%bU;fS;_D?$X?(Vwz3B9*grK&xTP7Tp8*Y-_t^{+acwtsHi-tFDj
zBUD^WzxQTaEil@$EUooSmqqUp2Z^wr-lytocodk|wwlfmR%yLfa;`(%j8WzL!skWu
zC2NX1nh)>U*4*pBdXd5K^CZzl=c7I>+pAQyJV3y3l}4BNRbAQA(@mo14&0G1zQ4A_
z^M&Ar&5Dr%Za!-kUUxQOU26JtWkmLUQHdO({cm*zBh$odyVCaQHrZ>bNhto8*e9;&
zqP?(p>CD$@?9*pHInz+Ox7&p?O-JMJEm05Gyk)%~Pj{a#R#*2beX93j@mx!p-puxM
zNyqYJo_6igee9xs&+pBFxEEa+nmdlJe7)pQ`0hf7YyF2eS54$RkaccF+*ZRqx!ruR
zTg87>Pxu$;z^5veAnj^-eESTe86uZXq;~NZR_K3deKYO$vCXf)J37qYXIcM0Q-9Gy
zff?JS`4ZD2YnwyPS-z;ywbH+Sd)<{ab7gYYJ4QeHvbp4yXYVnAH{x4DT$JMT&Ty@I
zU7h=NL#x$ob(3}0u8I3p7?o`@zWLl(y4tS6gg0&K`PX6zb*;_k?C#1O`z^p=+NF4O
z!6lho?klUJ1VeA%+r44yeG%`B*Ylp7nz!V}wol4i1T8OVPuzUP`MlLL^C^bheLOe#
zx?HpPwsaf}GMbgZ{#Z9ROyxoJ?X;iKGn#I0@5nmvlW*H!OPNi(et+5~cJ-M|*^^Bo
z*B*W4YUtTvu=V=nM!)}a%dPoO@hS%B6-(6JbX#6KZ$WXL_KIA!B`+r>w;5b0<=ZXj
zI5U;?hIG->WqHv~#tom<)>eg`w7%I|%B(i=jI2A0Tx_avy1+XrlhffJT+CmkxQhG<
zUzpW#siE2{f>Dt7&gwf2hoa6khM0GV%u*|V{;;}eWB0qaS8h%%*|2i;^8Gudy^ZcX
zS)6FS@<h`;-@P}_KVNSjGdI5a@2ZCl-S0V0ZR%LEQgy=egAOeU2VP4*`TtU(eV*O_
z)BN>LD;?Gyp4YVV@6nU{e1Zh6UuQlK`R$SUXZEdm`~H>GnMT}-{dn$P{`~qA$4U+U
zi)x3TcfN7c&R^hMZ^LGl*2lt!H8#(esNLqn*mJO^h&@{6A?MB9!`0U7Z=C#H@g&en
z-}9pOqWqo-!rzbW5s^Nq{vnCy`QO=vOx1@Un_rtGrBbXgMgEcH#^=JPn<bb1`M6x;
z*K<~>bO%164?NN8TYgpW82F!vnCLa>(CLdy_9RMFpP%*q!}&cM@9dE%R%kQKd3>?z
zD{~g3wzTWyNAExGJuH1S;;Uo(orgX~Mvczy@An>2nEqvxXZV->&nK<*z4+ZRp0j%0
zl|vl&JXv<DI!e6z@g`BUTuZ`cjz~V6txfr|eYL7b85dV5p5D59^9FGSVcxmZpY`N;
z`iHHVzGg#I-S4XWkar@t>d!E|ZM@A=t#P+<@vE<aPaddc#`WbrmOF69P+-k&OWw3^
zWx^+HPWpbF_0+xe+Qd6Q?%v+;S~27X_w@%A30u_NqMs->eB6@7af4&hiH;km7A$$U
zYe9AJh07s&r=M4E*2%9g6Vh35qeD@~Yp1#<!&wId{cmi+cg((u{f_JK<T?9mL2zZ_
zN85eH{|equJzM)PQ8axX8&{K>;-%enCuGhgeNQT#|0?Vv<5x?Me{6`F3)Dhth%c7<
z%)-EsEy}<EnjwJA1r#S|q^6YSq!#HFRPK$)?S5<~@K5eUy?|Zct(drNtxlXdi97FI
zYJL}ZW7_YGl<1osTUEm+nV;SNz9&cfQ?%Lco4NZ`wz+>kV{BaI<|n}N`DX2|<jASU
zu9xOy`EIjG{~X!Szs*bR$QzNxlH&X=;!8u??rd(FX1y{Z`vCVfyUUizPY>Ojb^h7r
zZ|@v;-&Zx=JxBeANZ$GnMMqoHPPK${FY4uz?!G$zgX}TGW5UM;Bec|fL>_u|pI*9C
z^Tp#+9y8aMoNZFu+5Pli1^4wc>8AF_&A;$0I$PuRAUX4Ke_WVY%WQd*K%u+YNh*vf
zZY4`4R5}Es0yZ3s_puSwGIIL7r|uI&V77uAe+#!qtB381U+KrTsr2o9pw{Pn_S4%Y
z6)!s@(a%NAmW9_vRlF`VmA;=Q@Gx%GnR~q_K81hs<=U2cx4LG+>nyG;M<#b`2?xFl
zix!ucu&^>+?unVaKjdgl&hHQvt!+DRI7snC#D3)|nffB+V@oSzT5)dg^`^IqBG~~`
zB~5k8`hNXjW?%U*=!oQ!Mb8gqPZRcAFiHIPgWXAMd9`mJ{qb9}c=oYt_u_0eFA$om
zdN$Q$MT2kDn%j4|RST>w_edqkyqvq6CCM_e%0y4p#6hB_RZhih<HY^^IUjt}msz$?
z5NC-NnB*tEBq55KfB*65?Rl>sJ>Mp@tw^P{mcw`FeZ$1<kFVc<pT$wV^mf_&0^_^a
zC9)>J{LZ_LvC?(Nc9ZLGLVClxp7t;``Y~>By+0?YsGvp0`Z$}Y=#r0e4Hqxei5n#^
zkC^9}vLo>R(x5k-5?hQDdOz)7?9X#-#RI7ci4qf{T;D`6tg1f6+jBYija&Kr^P9H*
zyYOzA#lG+A3!FKR1wB&v@~EZeo7FTSf!9^{5*bWRKj8H7ihj+!CG=q?L+F-_zyzff
zm%OzLiwm`E_3A#oob{(7iRXr(&;<W)F&7scWV3uSDQ$Jn(hDhx0W;rzny%1wKqq2(
zyGYTy*R{H{E7EP=*WaFFw#R%)?6ahpIjr|IFAILs<xY_n-F?w5Yqp4D+|>npBR~0M
z--|f1@S5_3>mB;9wly}H1WsNX^6i7G^o4t6Eu}H0E$RsuoO`;Ktf*MwU7(Zxgw=c|
z->iSZg;y^tpWe3KE&sUX#I$tN6Vn7sPsE)2yF75$<4-2OQb&HR<$hDO?IQ0C9bvnl
z(>OB!+`O@P$&8g#UYJ&t@9PP=U9^;UPTSR)ceCFH{^Viv?VKtV&?7xZI(|W1!G$$X
z)f4$^RymmMisBDTo%$r;ra?hvRQ1xx_YXyv9$K6(Q1VTcNk}HitU>MuJJZ4fRoBMb
z>8DP)8D_ljtKvF!lzUV2v*eQ-ci)KHtEc#tXNHffve1oi+X>1?qZV2{c`)~b>QeX5
zo3+lne5=2@m)SJ%Yu{N()9|Sl`ikWdZ*!|>Wqtc_<>NJe;g1JrNUi?(FM9t}tD23n
zdopYCTMlpL`=zg+yr*x)ed`tX7;HPQ@A;L_=H3+eA#VD^^!<+=&a4#wEq+Ew^Ygq0
z(+%@yulw{cN7CAE_ktB?0>3N1c<O1w|B-tJ%f%0cizI5_G@E5l+wRBq+k0!{?2Uh|
zU*7uHdWHY&v8N~VO!_v&OzM~F3Dz|7ePE;@?-^mO;?1u%tDxX|*2ULKHd^<qS%0wa
z)o6A9TGh?q&JgqZE8mNA2`&fM)E0l>Ysz>c&zxgE$vcv-?7ix)ii3YX%z5yC-ox`3
z6`tLn<@~-LQAnasm`Wfu?@RLYbMVcYCeD+aqt3{{FoTJKK?Yr4a(-S~W_(d<VhXsB
zT^rz=eb|6!FZ(BXAH9u=#@2m~{EO=o-dMF2X7BzuE5b2M^Y{17bC<|VzcGnTv9-6g
zJ=rg;u<<;{!gYUQj;yb!^q=+X;QLpr)(PnpYu0v%b=sHd2z_c*j1PY1WoaL=)Fo*V
z?-musO%2WxGuf*ozXl2&P`KFV5cZaRzDJJa&#(iz2aBR(C0|QK<%aas&QzcGx@)OL
z^(#pqGm$OHy4z$oC-NU_KfKI#Vs%9p>*a|%mnypl1s;3fnS1J95ku|{ZL!bhw`SDc
zvwwDqansfK9a~N{tKK_Pab}xTp|OIdhplRK+kL&m>w9EuUAU^Y%#KW(7IV<8<olc8
zT|Z@wnfFIb?)%7-@ot9pjSlU|j?zf0#1nn>bE?`4w*26~{_pdp)E{3Le7^AJvos=N
zK($v1n=kVs1_lN-M%3C195K0xnK^m|m9c$+d`$)dF8@7u9B$F~y}&#n;}PQ*F5jix
zW}4AX)BEq;Gh3jv+5Ym}m)W~d@=vgcdY9OK(Z5Oh_@)z=tz?<r-P*NGXF^Em)uc~+
z-Ztz;6>cZGFZ@cJadTUgk>B?tn|AJqaF(62DaUoCv%>YO97o#JQhk|E2OZ8>c(u>U
zYJKnoyV4^syV}#U?AEO5vG^}s@Kdq;sJ>O{ru#>4KMzW_opuz>Px&n6R_%-o3>TOg
z7^Kk?O>SXHNqllnCS>5EH|U@rD9wbwvX8JXy>x@!M~mH}xn)cBlx2EbGbT^i;q$wC
z(m7pbLr1;Bq~|~PKF=|my{V$gQtlv6%e2eOl3V)Nbh>^0$`1A(NcaCHn(;-?z~)ur
z1>bcOwp`zPyZ`-}YR5>f=fQf~-P|97wRYW+JH>QqR`rtyj_y<5y>Ym0JfU~ZTE_=*
z#t}!%(oYz%<x2P+sr6DcIk-1*N7L>W-LeHDkx5HebvSRI?B)88Vd7yw6YZ?0IzKg&
zHdGyXzuhj-dS}7PyIg<w7;WRQ??_ppy5gGHSE=0k+FkLxwCaNdcSfE2${%JOG2@E;
zjJphG=b}tvzUme2jVf4NQE+bclj;Xq)o)Yg%*tRg)d<`4IpxTLyiM(2gL59flbbj9
zsCN4`#q)Q?me`!N*)N$j-R+*!r5P6=Tv>dSpQoTqn8n0Ho<qv5Cvg8G-3Qu|@g?bB
zq?1_vXCB#m@tN<-ZEIWn7JWR+U~kHN^q=_8rccWY9A}uGp8aL^<TWoY2DpFz@3-Oq
zgzXaq*Ks#*`oV%olV1}zhE%MTDPUq`U{GOVV30+RzoOLK{E}2e43-82X0<r*{1xBh
zJY&6HPBp{Azc;17Fd41h$d|DxCCOWJZ?*d4z86l9+x2HopZ>)1`75u2G}jl)8kW3#
zp4_776A^xH-rMNz_cJR_?pd}@!8J`{N6ImwjqIr%r<w#Z5@zmYQ~MAeCsN`fAfF#D
z^7EeNnhnPpZ<z&L*jC$R!J95&sr6HGwu)x@<>}UYmR82=)cW~<FV$J|@#zKj^|Q}0
z=U(;}Im~~)U9vOi)89j<a$R11-ltws*KAj^D>}XS#G>S1E|Ik_!~~6P0z&-f-ek2a
ze{Q|G*HfbDV(avN!>#8x`!CfL_-E`GAg=hM@M+R@8ClEb&EDQO3$&)5_S*Smf9Y3t
zMBsrk^vmB{zwt6LFmSPAN&L_@X<|}NDrkZ?<Y3=y1A)EDANiH57&|A;QQms#U6%IO
z3#%@zyRtYnfg`NvY?aUUpTGMW1vcHx(EqAv_U&`^=d@#<lT`ZVt-TtM>B+Khs$9tR
z>^B!GG*nk|P5JmD<>^#Y;RUXDo3~%kSiGY3-c7E~36C^5YYLC>T&rB5tou6dSJ>*J
zpWoIxM`~~8uV52n4A5|XQM2o8;~wwl)<^Z{1uIG|4eaQd*w;LJxehl=?`Bzz*YB+=
zHEe!s?h=3Rx-@iyq4&QBYugLeV>%a~{1kjO$u=W0%jbMYj=1}QWD^mw?~@Arf|6zL
zyp`ONXnD(Kmc8^Wj|*$_d{0YB3p5EoZS~+Ro$UPb4ddK^zj`~)Bz6U@sQNeWJiA}(
zMA^7^-((K1E*1VJk}C21Mt5|T_Db!k+Kq3XDD*glJcw7*wcKgVvHt_>K2P5tY_86p
zQ-f8Pb!P4M-7)2fcGJe_R|g+%ZP1*%qHk*2={v<|_U~;HDBG03*4ZvLYDI<B+hw<N
z=Kct;bTIr<ET{I_lI8T)FGlTsx5M5UHlL4wxZHGy*Ylts269WTML1Wc__i#)@sO8=
zQ{vZG$Bd=YF4N_>+NE}`zx1Z($C2}$XP2MMS6esJvhuOV&x_~U4e$5on?Ja@EI+rF
zdAm@^yvZ|D%nwh!dV0Z~-w*9(Rf+88`M&AV|DAmIZ|j99WHhKKoc`}`^L?5}Z9vn~
zsXKe;-92yvslEoKqI9483aTs&3|c%43{vP>u(&t_k^k0)MQ6V;15bo-ICq>ayz<Op
zq0SNkzULR5yqzc8>2?R^REGEJa(d=%{=d(7($lY|{>S;Z=^4*|_UY`2t%16Q>AFuQ
zc7$m^KJot0uGgzyudZ7)GjVN2@ZqLShcC=~>v3+b)W@z_rcGJ@)>Xb#T2;6GTg&VP
z&VkdoGItif?6=%_ZpmJ&+NS&{k*ygOfhh`^J4*hlpJpprcqjSvy%oW$7Pf6a^>I-S
z3&&CB|DU?!|46Nhji1W9d0I{8YT0ufHlpi2135Hf0+&oPFZJ`f;nrLfw9-jh@owLq
zLyAut_sr;f?jjx6U9QiZ?K$Z!lb9WcBO{~P1Ka5SiVc$O#+?kjzY`6%{rdUy`h!#L
z+p0Ntf7ZOy&s=cAFo~7zX7oN2s}+kLCYs#tzoj71p6u+S&i$bx>3Cm5d#!`Cfrffp
z_Bp+ee~w9=HZJ<!eg9r_Wc$R(w&W$>+D~^GKfk!ooHx1k$fAF9(=Na5iasJ?y@UV$
zVV-ugR~ji@Twj)~nY^Yo<aZ{!&f9h=qmT2ALd9bH{nzqnhTb-cY`lE$=}HHSBSn#>
zPM@|+cU_f|-6W;4?(Utrc3M+1c^y_RT`$A;Y|Epit17B)@BH=d`RyE6?<*JgG`4E9
zJ$n3|?Kcy@VPRf<d40r>w~v?Y>RkF~?~`5Y%YR+<Z<*w8p?XHh&e}p|Mnz$evBvK%
z4bK|8j7e)bKi|}<P@mfUCaP2YnZ1$8llzyAzKhQF)wnL%Ip1)*b*$m>>a65o<3+3;
zN(C(13kz25$mz*GExb72yU6Lt%(>?bGHdTwNm%LCc6Mjxf9se%-~PO?t;2;NPtLXG
zuCEq-ab7RGLMBos+<nbFm$hY5JwG4+`SbRvW{F_e+U*kOJlijJY31J6O1zZ$`Nx)?
z`4(Oe3|jc37-F3GYrVo4N}qGJ#HdxwY_4f$y*<rG^qP#8bZX_S-rb)pEM897b~<Va
z(<O~r@)aqe>0Sl*4U3-$pHlHGn)zp~^ieJEJDtv~-p{MItom!?AaI~1M!Q(e@8?&B
zm(5NmPiH=f++Tcg!W`utN_KyyO*+0zaa(n-P*e2z+XX^*4vMe2<gn3kZP}(r%iNbq
z$0dkz9FIN{biw$6jyxy-?6+c9*F2JMI(oms#P5ILg+<8^1oUUW=BsQ=s9!K`@@?tg
zhkN&`nyc_Gb3Y(j^mCpu<8P1F!*jPKiB=qaVtJRlr?J14pX=N=PFt?&PgFFyYV{&3
zo9yN11O*m8WB(uZ=EKQ{8=h@27rL?I&dm*}9YGow*GA-Ad!`n*<VSheAGa^dc_hkT
zd7tL2wN%$_dHZnr@83)HA3jfB{Z4Lo^6Tug&XcYiCx*8EKfxpMM&D$O)Sl80rw+YI
zdU|!$!6c5OTN?L#629!H>~(yt%J+w7e*KBDiM+RI|KFciB~quUniQ9}vU;D&xp34V
zap8ymNL3V<_2Cfp|Jo~#GB7YmF)}bHAPN^<13d#hGrg3|;u77=ytI6MU)K;v7sn9C
z)c#m+W<vqj`_IGAEUxvqF*QhK!3GVjEoZyBr`h?v&Nw_PW%ijxf4?tllD}}>vc3Af
zPUMT$mMg}~-y|7Stjpf;<mQ6zOBJskiihsHWc<SIy{0UW+{0Y0SMENxyBZEVmKh$X
z{j!FwN?XvsEbsQz)-)Xz$v4x^nriLIzP|QopZS!dg$=E@i%$Ii(_TL5`iwvKpHBR~
z*n7^^-qT413t~g+^qbPdr*ED2vZ`p+l-zaw?u%_gU%p&<Xg+iPe&c1ooWg}0=G*;1
zT6zTvf;+ocH^wk9Fn};p69*#*!aZDFeYnqi_@2GU>#eJG?#%hkK?YZh9~AkY_15*$
zIjO%X$iwTTj$Wre`^vxz1{aLYE*oEZ!gcDr{>864*LXE_z0RKW*%YLqspb2W%hP9j
zkj4s=YiCcN_rB_TX7!UtOh}7VLC#9peD??!189{i1A{7_m?_CGh|ftaOU=<MsVF&p
zM!)ck@0n-lh8=O_U{YmfV5nq8nNY{@W00$}e~`=COD88S$`EOLSR2b7apv$M@iPk)
zj5Hp#IXwHA{v-6mtKGX6U-H|mR9?&Mzo&3tFr!9E;b-HnRr{I(w@8Mi=p{F${aX|f
zS=ct~va7zE^8FV~Q|@`)JbUuavc=!8ZQ#|DimWpK+L2(t>V7~>itV2z9;sCcUt%wm
zY@K^jasR6HxJY3>-lYtim-4xsReZ^_YHE7R6OVuPE4rVbHw{pIH)o~uGofSGl!aLr
zAImy#v_2$d=bRNCdC{f!L>br<4f-lAIbZCGj#o8Y^GoU1tmPb+nV+A2Vpza;^nUr3
zmuwz4Qf_4Os8=lLZx4|<X=;9f?O<h3)yByB^=cQ&-_Mz`VcEUL9G*SPB}{g-O|Ht*
z-w`yceD96<rxyE$h3s%sa4FzB9v>50Hh)G*`l`qG_IxRsC}h-FsnciM9DiYj*}o?_
zu41xW+Af`Y93`3_#hsZmC9*1e^UJqIM`o<gyA_dsyf`*1Z|0>>H}xj-)!k0Fz0A(;
zR~I89sbF$+qCOAPg@5(^AJ<Q7uv@=Kv-|S)BgcwuwUt}#SXT3<My3UBxil#^*^~2w
z$cC*xkMF$ywkuD8$9eDU*qE*J*L*Ir_4*aOZ<?jz4$elgdj-2MEm<wQ(E8xbBN5v&
z4leGrXnC+dO1UNQQds=Fl>Zervyb_RD)ziTTk9@-ZfC+Dh77xRHzyvn(lzZ$DwriW
zFZJF@&DRWP{<(ZLxRO@5T(<33!1G(FDc2m9Ju#|xThjP=idmUSRh5=$>tEy3*1xKs
z|G1Sl|HPw&gP{^f_B^u=thI6pnGw<B)Tw)3w|2|=V~4FzIvxmOYZCr5J@?tpKbwQ%
zdJUEqIrjTH-C7wqW7+Q+H@ud*&($s48NSDQ>*~$zds-*#UuEwhayvmfZE~2g%W6Az
zd)=erDF?;v9?a4Ws24vz*Kt$uE}sc;)A)|_oNB!NN~C&XpzYC(HQ(ww1Y|z0m44Bc
zRJY*U3p1^0ty`9z-^{AEHE;bs!z7(T`7e&C8}1aaEc^Py)#1l`UyimFXWvEcZsh*6
zVY;;RqEKhOJ-x9mB@cpk*GxH(y=~DZ_r=P2`G(1+xf`Dgyo<gSs&ad(;FII`1H2iT
zM8KoW*w>*$m!vanYXq@iBhg5!(vb}Swe!$drGvDA@U}){ME2K*EqX!LjcoxbNGAwy
zYdpq+SQMWKSx$<q8QXdrkVX*R)_8>*p&9$?8)UOU-auca05S)Jw>7@vLzsoSW&zm@
zY%|ax{UE%pF-Q<$24p@OSue<b^f>^KJ`mp4$RmN!3+;V@2dj`xz&1bz(hb7f8VzL;
zCV)p}@I)v2a2d!15Z>09iEawo;2E-eKt4hr7Xq0A!rK~8$)ULiI!c6Y0{SQnNH+*?
zYn&&KZUV}f46;Gkh66x`fbh1)I7Kvr&<6*QjRN@!y>kpQ286dY&Q?M*3L06^t}?no
z==~#*At1c1@u3R3LCC!&WOG0jt~y#%2xJBbZ)>#Egqwp=W5OCn=%%5!DnKTI@U})r
zE!?Jo+ZgCZp|=D;#(?m)#v6EyLTMME8;RZ?02v3uTNqWfak~!EItcJ)Wdo@dVi02Z
M$-=<UrU&8y0J5uCh5!Hn

literal 0
HcmV?d00001

diff --git a/iotAmak/agent.py b/iotAmak/agent.py
index bbaaf26..8ccb58e 100644
--- a/iotAmak/agent.py
+++ b/iotAmak/agent.py
@@ -21,19 +21,19 @@ class Agent(Schedulable):
 
     def __init__(self, arguments: str) -> None:
 
-        arguments = json.loads(arguments)
+        arguments: Dict = json.loads(arguments)
 
         broker_ip: str = arguments.get("broker_ip")
         identifier: int = int(arguments.get("identifier"))
         seed: int = int(arguments.get("seed"))
+        broker_username: str = str(arguments.get("broker_username"))
+        broker_password: str = str(arguments.get("broker_password"))
 
         self.id: int = identifier
 
         random.seed(seed + 10 + self.id)
 
-        print(random.random())
-
-        Schedulable.__init__(self, broker_ip, "Agent" + str(self.id))
+        Schedulable.__init__(self, broker_ip, "Agent" + str(self.id), broker_username, broker_password)
 
         self.subscribe("scheduler/agent/wakeup", self.wake_up)
 
@@ -58,8 +58,7 @@ class Agent(Schedulable):
         put the metric in a list that will be rad during on_perceive
         param message: metric (dict) of the neighbor
         """
-        print(message.payload.decode("utf-8"))
-        result = literal_eval(message.payload.decode("utf-8"))
+        result: Dict = literal_eval(message.payload.decode("utf-8"))
         self.next_neighbors.append(result)
 
     def log(self, message: str) -> None:
diff --git a/iotAmak/amas.py b/iotAmak/amas.py
index 8d81578..d335985 100644
--- a/iotAmak/amas.py
+++ b/iotAmak/amas.py
@@ -25,21 +25,21 @@ class Amas(Schedulable, SSHClient):
 
         arguments = json.loads(arguments)
 
-        broker_ip: str = arguments.get("broker_ip")
+        self.broker_ip: str = arguments.get("broker_ip")
         clients: str = arguments.get("clients")
-        seed: int = int(arguments.get("seed"))
+        self.seed: int = int(arguments.get("seed"))
+        self.broker_username: str = str(arguments.get("broker_username"))
+        self.broker_password: str = str(arguments.get("broker_password"))
+        iot_path: str = str(arguments.get("iot_path"))
 
-        random.seed(seed)
+        random.seed(self.seed)
 
-        Schedulable.__init__(self, broker_ip, "Amas")
+        Schedulable.__init__(self, self.broker_ip, "Amas", self.broker_username, self.broker_password)
 
         true_client = [RemoteClient(i.get("hostname"), i.get("user"), i.get("password")) for i in literal_eval(clients)]
 
-        SSHClient.__init__(self, true_client)
+        SSHClient.__init__(self, true_client, iot_path)
 
-        self.seed: int = seed
-
-        self.broker_ip: str = broker_ip
         self.subscribe("scheduler/schedulable/wakeup", self.wake_up)
 
         self.next_id: int = 0
@@ -78,10 +78,16 @@ class Amas(Schedulable, SSHClient):
         if args is None:
             args = []
 
-        arg_dict = {"broker_ip": str(self.broker_ip), "seed": self.seed, "identifier": self.next_id}
+        arg_dict = {
+            "broker_ip": str(self.broker_ip),
+            "seed": self.seed,
+            "identifier": self.next_id,
+            "broker_username": self.broker_username,
+            "broker_password":  self.broker_password
+        }
 
         command = "nohup python "
-        command += "\'Desktop/mqtt_goyon/example/" + experience_name + "/"+agent_name+"\' \'"
+        command += "\'" + self.iot_path + experience_name + "/"+agent_name+"\' \'"
         command += json.dumps(arg_dict) + "\' "
         for arg in args:
             command += str(arg) + " "
@@ -97,7 +103,7 @@ class Amas(Schedulable, SSHClient):
         else:
             have_found = False
             for i_client in range(len(self.clients)):
-                if self.clients[i_client].hostname == i_client:
+                if self.clients[i_client].hostname == client_ip:
                     self.agents_cmd[i_client].append(Cmd(command))
                     have_found = True
                     break
@@ -105,7 +111,6 @@ class Amas(Schedulable, SSHClient):
                 self.agents_cmd[0].append(Cmd(command))
 
         self.subscribe("agent/" + str(self.next_id) + "/metric", self.agent_metric)
-        self.subscribe("agent/" + str(self.next_id) + "/log", self.agent_log)
 
         self.client.publish("amas/agent/new", self.next_id)
         self.next_id += 1
@@ -115,6 +120,7 @@ class Amas(Schedulable, SSHClient):
         Method used to start new agent trough ssh
         """
         for i_client in range(len(self.clients)):
+            print(" Ip : ", self.clients[i_client].hostname)
             self.run_cmd(i_client, self.agents_cmd[i_client])
         print("Amas, push agent done")
 
@@ -124,12 +130,6 @@ class Amas(Schedulable, SSHClient):
         """
         self.publish("amas/agent/" + str(id_agent1) + "/neighbor", str(self.agents_metric[id_agent2]))
 
-    def agent_log(self, client, userdata, message) -> None:
-        """
-        Called when the amas receive a log from any agent, print it in stdout
-        """
-        print("[Log] " + str(message.payload.decode("utf-8")) + " on topic " + message.topic)
-
     def agent_metric(self, client, userdata, message) -> None:
         """
         Called when the amas receive new metrics from any agent
diff --git a/iotAmak/communicating_agent.py b/iotAmak/communicating_agent.py
index 17521a2..0600ea9 100644
--- a/iotAmak/communicating_agent.py
+++ b/iotAmak/communicating_agent.py
@@ -1,6 +1,7 @@
 import json
 import pathlib
 import sys
+from ast import literal_eval
 from typing import List, Any
 
 sys.path.insert(0, str(pathlib.Path(__file__).parent))
@@ -17,13 +18,13 @@ class CommunicatingAgent(Agent):
     def __init__(self, arguments: str) -> None:
         self.mailbox: List[Mail] = []
         Agent.__init__(self, arguments)
-        self.subscribe("mail", self.receive_mail)
+        self.subscribe("agent/" + str(self.id) + "/mail", self.receive_mail)
 
     def receive_mail(self, client, userdata, message) -> None:
         """
         Called when the agent receive a new message
         """
-        raw = json.loads(message)
+        raw = literal_eval(message.payload.decode("utf-8"))
         self.mailbox.append(Mail(raw.get("id"), raw.get("cycle"), raw.get("payload")))
 
     def send_mail(self, agent_id: int, payload: Any) -> None:
@@ -34,4 +35,29 @@ class CommunicatingAgent(Agent):
         """
 
         new_mail = {"id": self.id, "cycle": self.nbr_cycle, "payload": payload}
-        self.publish("agent/" + str(agent_id) + "/mail", json.dumps(new_mail))
+        self.client.publish("agent/" + str(agent_id) + "/mail", json.dumps(new_mail))
+
+    def next_mail(self) -> Mail:
+        """
+        Convenient method to use to go through the mailbox
+        :return: the next mail, if no mail are in the mailbox, return None. Remove the mail from the mailbox
+        """
+        if len(self.mailbox) == 0:
+            return None
+        return self.mailbox.pop(0)
+
+    def put_back(self, mail: Mail) -> None:
+        """
+        Put the mail at the end of the mailbox
+        """
+        self.mailbox.append(mail)
+
+    def put_front(self, mail: Mail) -> None:
+        """
+        put the mail in the front of the mailbox
+        """
+        self.mailbox = [mail] + self.mailbox
+
+
+
+
diff --git a/iotAmak/environment.py b/iotAmak/environment.py
index 1691058..b054cbc 100644
--- a/iotAmak/environment.py
+++ b/iotAmak/environment.py
@@ -22,10 +22,12 @@ class Environment(Schedulable):
 
         broker_ip: str = arguments.get("broker_ip")
         seed: int = int(arguments.get("seed"))
+        broker_username: str = str(arguments.get("broker_username"))
+        broker_password: str = str(arguments.get("broker_password"))
 
         random.seed(seed + 1)
 
-        Schedulable.__init__(self, broker_ip, "Env")
+        Schedulable.__init__(self, broker_ip, "Env", broker_username, broker_password)
 
         self.subscribe("scheduler/schedulable/wakeup", self.wake_up)
 
diff --git a/iotAmak/scheduler.py b/iotAmak/scheduler.py
index 9f89941..19e21ea 100644
--- a/iotAmak/scheduler.py
+++ b/iotAmak/scheduler.py
@@ -17,12 +17,12 @@ class Scheduler(Schedulable):
     Scheduler class, it's role is to make sure the amas, the env and all the agents stay in sync
     """
 
-    def __init__(self, broker_ip: str) -> None:
+    def __init__(self, broker_ip: str, broker_username: str, broker_password: str) -> None:
 
-        Schedulable.__init__(self, broker_ip, "Scheduler")
+        Schedulable.__init__(self, broker_ip, "Scheduler", broker_username, broker_password)
         self.paused = True
 
-        self.nbr_agent = 0
+        self.nbr_agent: int = 0
         self.subscribe("amas/agent/new", self.update_nbr_agent)
         self.subscribe("amas/action_done", self.update_schedulable)
         self.subscribe("env/action_done", self.update_schedulable)
diff --git a/iotAmak/tool/confi_reader.py b/iotAmak/tool/confi_reader.py
index ca9b344..5070707 100644
--- a/iotAmak/tool/confi_reader.py
+++ b/iotAmak/tool/confi_reader.py
@@ -9,10 +9,10 @@ from iotAmak.tool.remote_client import RemoteClient
 
 def read_ssh(path):
     with open(path, 'r', encoding='utf-8') as f:
-        dict = json.load(f)
+        ssh_dict = json.load(f)
 
     res = []
-    for client in dict.get("clients_ssh"):
+    for client in ssh_dict.get("clients_ssh"):
         res.append(RemoteClient(
             hostname=client.get("hostname"),
             user=client.get("user"),
diff --git a/iotAmak/tool/mail.py b/iotAmak/tool/mail.py
index cda8892..ab07008 100644
--- a/iotAmak/tool/mail.py
+++ b/iotAmak/tool/mail.py
@@ -2,6 +2,9 @@ from typing import Any
 
 
 class Mail:
+    """
+    Mail class used by the communicating agent
+    """
 
     def __init__(self, sender_id: int, date: int, payload: Any) -> None:
 
diff --git a/iotAmak/tool/mqtt_client.py b/iotAmak/tool/mqtt_client.py
index 3c5289a..9ee4e91 100644
--- a/iotAmak/tool/mqtt_client.py
+++ b/iotAmak/tool/mqtt_client.py
@@ -11,9 +11,9 @@ class MqttClient:
     Base class to any instance that need to interact with the broker
     """
 
-    def __init__(self, broker_ip: str, client_id: str):
+    def __init__(self, broker_ip: str, client_id: str, broker_username: str, broker_password: str):
         self.client: Client = Client(client_id=client_id)
-        self.client.username_pw_set(username="goyon", password="mosquitto")
+        self.client.username_pw_set(username=broker_username, password=broker_password)
         self.client.connect(host=broker_ip)
         self.client.loop_start()
 
diff --git a/iotAmak/tool/schedulable.py b/iotAmak/tool/schedulable.py
index d8c4f1c..0a27304 100644
--- a/iotAmak/tool/schedulable.py
+++ b/iotAmak/tool/schedulable.py
@@ -1,7 +1,6 @@
 """
 Tool class that implement basic interaction that help to finish processes
 """
-from time import sleep
 
 import sys
 import pathlib
@@ -17,8 +16,8 @@ class Schedulable(MqttClient):
     Base class for Agent/Amas/Env/scheduler
     """
 
-    def __init__(self, broker_ip: str, client_id: str):
-        MqttClient.__init__(self, broker_ip, client_id)
+    def __init__(self, broker_ip: str, client_id: str, broker_username: str, broker_password: str):
+        MqttClient.__init__(self, broker_ip, client_id, broker_username, broker_password)
 
         self.exit_bool: bool = False
         self.subscribe("ihm/exit", self.exit_procedure)
diff --git a/iotAmak/tool/ssh_client.py b/iotAmak/tool/ssh_client.py
index 83f1f76..858df6d 100644
--- a/iotAmak/tool/ssh_client.py
+++ b/iotAmak/tool/ssh_client.py
@@ -1,4 +1,3 @@
-
 from typing import List
 
 import paramiko
@@ -23,8 +22,9 @@ class Cmd:
 
 class SSHClient:
 
-    def __init__(self, clients: List[RemoteClient]):
+    def __init__(self, clients: List[RemoteClient], iot_path: str):
         self.clients = clients
+        self.iot_path = iot_path
 
     def run_cmd(self, client: int, cmd: list, repeat: bool = False) -> list[str]:
         ret = []
@@ -53,20 +53,22 @@ class SSHClient:
             transport = paramiko.Transport((client.hostname, 22))
             transport.connect(username=client.user, password=client.password)
             sftp = MySFTPClient.from_transport(transport)
-            sftp.mkdir("Desktop/mqtt_goyon/example/" + experiment_name, ignore_existing=True)
+            sftp.mkdir(self.iot_path + experiment_name, ignore_existing=True)
 
             sftp.put_dir(
                 path_to_experiment,
-                "Desktop/mqtt_goyon/example/" + experiment_name
+                self.iot_path + experiment_name
             )
             sftp.close()
 
+
 class MySFTPClient(paramiko.SFTPClient):
     def put_dir(self, source, target):
-        ''' Uploads the contents of the source directory to the target path. The
-            target directory needs to exists. All subdirectories in source are
-            created under target.
-        '''
+        """
+        Uploads the contents of the source directory to the target path. The
+        target directory needs to exists. All subdirectories in source are
+        created under target.
+        """
         for item in os.listdir(source):
             if os.path.isfile(os.path.join(source, item)):
                 self.put(os.path.join(source, item), '%s/%s' % (target, item))
@@ -80,7 +82,9 @@ class MySFTPClient(paramiko.SFTPClient):
                     print(os.path.join(source, item))
 
     def mkdir(self, path, mode=511, ignore_existing=False):
-        ''' Augments mkdir by adding an option to not fail if the folder exists  '''
+        """
+        Augments mkdir by adding an option to not fail if the folder exists
+        """
         try:
             super(MySFTPClient, self).mkdir(path, mode)
         except IOError:
diff --git a/setup.py b/setup.py
index ee51db1..c884117 100644
--- a/setup.py
+++ b/setup.py
@@ -3,7 +3,7 @@ from setuptools import setup, find_packages
 setup(
     name='iotAmak',
     packages=find_packages(),
-    version='0.0.5',
+    version='0.0.6',
     description='AmakFramework in python',
     author='SMAC - GOYON Sebastien',
     install_requires=[
-- 
GitLab