+
    :ia                        a  R t 0 t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
HtHtHtHtHt ^ RIHt ^ RIHt ^RIHt ^RIHt Rt] ^ k Rt] ^k ]P4                  ! ]4      t ! R	 R
]4      t ! R R4      t ! R R4      tR# )    N)AnyDictFinalOptionalTuple)ARC4)MiIOProtocol)DeviceException)VERSIONڌaHR0cHM6Ly93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20vbXAvY29sbGVjdD9tZWFzdXJlbWVudF9pZD1HLTcwN1g2N0MzWlAmYXBpX3NlY3JldD1jX2taVDJlV1N1Q3Q4Q2swTGdtaE1nze3siY2xpZW50X2lkIjoiezB9IiwiZXZlbnRzIjpbe3sicGFyYW1zIjp7eyJ2ZXJzaW9uIjoiezF9IiwibW9kZWwiOiJ7Mn0iLCJkZXZpY2VfaWQiOiJ7MH0iLCJzZXNzaW9uX2lkIjp7M30sImVuZ2FnZW1lbnRfdGltZV9tc2VjIjoxMDB9fSwibmFtZSI6Ins0fSJ9fV19fQ==c                   r   a a ] tR t^t oV3R lV 3R lltV3R lR lt]V3R lR l4       tR tRt	Vt
V ;t# )	DreameVacuumDeviceProtocolc                *   < V ^8  d   QhRS[ RS[ RR/# )   iptokenreturnNstr)format__classdict__s   ":/config/custom_components/dreame_vacuum/dreame/protocol.py__annotate__'DreameVacuumDeviceProtocol.__annotate__   s"     ( (3 (s (t (    c                l   < \         SV `  W^ ^ R^4       RV n        RV n        V P	                  W4       R# )r   TN)super__init__r   r   set_credentials)selfr   r   	__class__s   &&&r   r   #DreameVacuumDeviceProtocol.__init__   s4    Aq$2
R'r   c                &   < V ^8  d   QhRS[ RS[ /# )r   r   r   r   )r   r   s   "r   r   r   "   s     	% 	%# 	%c 	%r   c                    V P                   V8w  g   V P                  V8w  dD   Wn         R V n        W n        Ve   VR8X  d   Rp\        P	                  V4      V n        RV n        R# R# )i1  N F 00000000000000000000000000000000)r   r   portbytesfromhex_discovered)r    r   r   s   &&&r   r   *DreameVacuumDeviceProtocol.set_credentials"   sV    77b=DJJ%/GDIJ} u-DJ$D 0r   c                    < V ^8  d   QhRS[ /# r   r   bool)r   r   s   "r   r   r   .   s        4  r   c                    V P                   # Nr*   r    s   &r   	connected$DreameVacuumDeviceProtocol.connected-   s    r   c                    R V n         R# FNr2   r3   s   &r   
disconnect%DreameVacuumDeviceProtocol.disconnect1   s
     r   )r*   r   r'   r   )__name__
__module____qualname____firstlineno__r   r   propertyr4   r8   __static_attributes____classdictcell____classcell__)r!   r   s   @@r   r   r      s7     ( (	% 	%    ! !r   r   c                   R  a  ] tR t^5t o RKV 3R lR lltRLR lt]V 3R lR l4       t]V 3R lR l4       t]V 3R	 lR
 l4       t	]V 3R lR l4       t
]V 3R lR l4       t]V 3R lR l4       tRMV 3R lR lltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltRNV 3R lR  lltROV 3R! lR" lltROV 3R# lR$ lltRLV 3R% lR& lltRPR' ltRPR( ltRPR) ltV 3R* lR+ ltRKV 3R, lR- lltV 3R. lR/ ltV 3R0 lR1 ltV 3R2 lR3 ltRLV 3R4 lR5 llt V 3R6 lR7 lt!V 3R8 lR9 lt"R: t#]$R; 4       t%]$V 3R< lR= l4       t&]$V 3R> lR? l4       t']$V 3R@ lRA l4       t(]$V 3RB lRC l4       t)]$V 3RD lRE l4       t*]$V 3RF lRG l4       t+]$V 3RH lRI l4       t,RJt-V t.R# )QDreameVacuumCloudProtocolNc                <   < V ^8  d   QhRS[ RS[ RS[ RS[ RS[ RR/# )r   usernamepasswordcountryauth_key	device_idr   Nr   )r   r   s   "r   r   &DreameVacuumCloudProtocol.__annotate__6   s=     )) ))))'*))58))DG))[^))	))r   c           	        Wn         W n        W0n        W@n        \        P
                  ! 4       V n        R V n        R V n        R V n	        R V n
        R V n        R V n        RV n        RV n        R V n        WPn        \"        P%                  4       V n        V P                  '       dd   V P                  P)                  R4      p\+        V4      ^8X  d9   V^ ,          V n
        V^,          V n        V^,          V n	        V^,          V n        RV P&                   R2V n        \.        P0                  ! 4       ^ ,          V n        RV n        R V n        R V n        ^ V n        RV n         \>        P@                  ! 4       PB                  ^ 8X  d   \>        PD                  M\>        PF                  ^<,          R	,          pRPI                  V^ 8  d   RMR\K        \M        V^<,          4      4      \M        V^<,          4      4      V n'        R #    RT n'         R # ; i)
NF z&Android-7.1.1-1.0.0-ONEPLUS A3010-136-z  APP/xiaomi.smarthome APPV/62830zGMT{}{:02d}:{:02d}+-z	GMT+00:00)(	_username	_password_country	_auth_keyrequestssession_session_sign
_ssecurity_userId_service_token_captcha_ick_captcha_code
_logged_in_auth_failed_uid_didrC   generate_client_id
_client_idsplitlen
_useragentlocalegetdefaultlocale_locale_v3verification_urlcaptcha_img_fail_count
_connectedtime	localtimetm_isdsttimezonealtzoner   absint	_timezone)r    rE   rF   rG   rH   rI   dataoffsets   &&&&&&  r   r   "DreameVacuumCloudProtocol.__init__6   s    "!! ((*
" !!		3FFH>>>>>'',D4yA~&*1g#"&q'#Aw"&q'B4??BSSst..03 $	)(,(8(A(AQ(FdmmT\\]__bddF188{SVb[1A-BCQSDTDN	)(DNs    BG> >	H
c           	         V P                  V P                  4        R V 2R\        P                  ! VRR7      /V4      pV P	                  V4      '       g   RV n        RV n        RpV# )/rv   
separatorsFTN,:)requestget_api_urljsondumpscheck_loginr]   r^   )r    urlparamsretry_countresponses   &&&& r   	_api_call#DreameVacuumCloudProtocol._api_calla   sj    <<!"!C5)TZZ:>?
 ))#DO $DHr   c                    < V ^8  d   QhRS[ /# r-   r.   )r   r   s   "r   r   rJ   o         4 r   c                    V P                   # r1   )r]   r3   s   &r   	logged_in#DreameVacuumCloudProtocol.logged_inn       r   c                    < V ^8  d   QhRS[ /# r-   r.   )r   r   s   "r   r   rJ   s   s     ! !T !r   c                    V P                   # r1   )r^   r3   s   &r   auth_failed%DreameVacuumCloudProtocol.auth_failedr   s       r   c                    < V ^8  d   QhRS[ /# r-   r.   )r   r   s   "r   r   rJ   w   r   r   c                    V P                   # r1   )rm   r3   s   &r   r4   #DreameVacuumCloudProtocol.connectedv   r   r   c                    < V ^8  d   QhRS[ /# r-   r   )r   r   s   "r   r   rJ   {   s      3 r   c                    V P                   # r1   )r`   r3   s   &r   rI   #DreameVacuumCloudProtocol.device_idz   s    yyr   c                .   < V ^8  d   QhRS[ R,          /# )r   r   Nr   )r   r   s   "r   r   rJ      s      #* r   c                    V P                   # r1   )rS   r3   s   &r   rH   "DreameVacuumCloudProtocol.auth_key~   s    ~~r   c                    < V ^8  d   QhRS[ /# r-   r   )r   r   s   "r   r   rJ      s     6 6S 6r   c                ^    \        V P                  4       R \        V P                  4       R2# )rz   z/0)r   r_   r`   r3   s   &r   object_name%DreameVacuumCloudProtocol.object_name   s'    dii.!3tyy>"2"55r   c                    < V ^8  d   QhRS[ /# r-   r.   )r   r   s   "r   r   rJ      s      D r   c                    Vfb   V P                  V P                  4        R2R\        P                  ! R\	        \
        P
                  ! 4       4      ^<,
          /RR7      /^4      pVeL   VP                  RR4      pVP                  R^ 4      pV^8X  g   V^8X  g   RV9   g   R	V9   g   R
V9   d   R# R#  R#     R# ; i)Nz/v2/message/v2/check_new_msgrv   begin_atr{   messager%   codezauth errzinvalid signatureSERVICETOKEN_EXPIREDFTr}   )r   r   r   r   rt   rn   get)r    r   r   r   s   &&  r   r   %DreameVacuumCloudProtocol.check_login   s    	<<'')**FG

 *C		,<r,A (2	!  #",,y"5||FA.AIqy!W,*g5-8  $ 	s   B0B9 9B>c                    < V ^8  d   QhRS[ /# r-   r.   )r   r   s   "r   r   rJ      s      d r   c                    V P                   P                  R RV P                  RR/RV P                  /^R7      pVe   VP                  ^8X  d   V P                  VP                  4      pVP                  R4      V n        VP                  R4      ^ 8X  dY   VP                  RV P                  4      V n        VP                  R	V P                  4      V n	        VP                  R
4      V n
        R# RV n        R#     R# ; i)zDhttps://account.xiaomi.com/pass/serviceLogin?sid=xiaomiio&_json=true
User-AgentContent-Type!application/x-www-form-urlencodeddeviceId)headerscookiestimeoutrW   r   userId	ssecuritylocationTF)rV   r   re   rb   status_codeto_jsontextrW   rY   rX   	_locationr^   )r    r   rv   s   &  r   login_step_1&DreameVacuumCloudProtocol.login_step_1   s    	}}((V $//"$G $T__5 ) H #''3.<<6D!%'!2DJxx'1,'+xx$,,'G*.((;*P)-*)=$(! 	s   C-C: 1C: :C?c                    < V ^8  d   QhRS[ /# r-   r.   )r   r   s   "r   r   rJ      s     > >d >r   c           
        R V n         RV P                  R\        P                  ! \        P                  V P                  4      4      P                  4       P                  4       RRRRRR/pV P                  '       d   V P                  VR	&   R
R/pRV n
        RV n         / pV P                  '       dY   V P                  '       dG   V P                  VR&   \        \        P                  ! 4       R,          4      VR&   V P                  VR&   V P                   P#                  RRV P$                  RR/VVV^R7      pVEe{   VP&                  ^8X  Edb   V P)                  VP*                  4      pVP-                  R4      pV'       dK   VP-                  RV P.                  4      V n        VP-                  RV P0                  4      V n        WPn        R# RV9   d;   VR,          V n
        V P                  R,          R8w  d   RV P                   2V n
        RV9   d   VR,          pV'       d   VR,          R8w  d   RV 2pV P                   P-                  V4      pVP4                  P-                  R4      ;p'       d:   Wpn        \6        P8                  ! VP:                  4      P=                  4       V n        RV n         R #     R # ; i)Fuserhashcallbackzhttps://sts.api.io.mi.com/stssidxiaomiioqsz %3Fsid%3Dxiaomiio%26_json%3DtruerW   _jsontrueNcaptCode  _dcickz1https://account.xiaomi.com/pass/serviceLoginAuth2r   r   r   )r   rv   r   r   r   r   r   r   TnotificationUrl:N   Nhttpzhttps://account.xiaomi.com
captchaUrl)r^   rP   hashlibmd5r   encoderQ   	hexdigestupperrW   rj   rk   r\   r[   rt   rn   rV   postre   r   r   r   r   rY   rX   r   r   base64	b64encodecontentdecode)r    rv   r   r   r   r   r   r   s   &       r   login_step_2&DreameVacuumCloudProtocol.login_step_2   sm   !DNNGKK

4>> :;EEGMMO7:4
 ::: JJDM6" $-	G!!!d&7&7&7#'#5#5Z  #DIIK$$6 7u!%!2!2}}))C $//"$G  * 
H #''3.<<6D#xx
3H'+xx$,,'G*.((;*P)1#(D0045F0G-004>6PQUQfQfPg4hD1#t+"<0"2w&0(B3%&H'+}}'8'8'=H&.&6&6&:&:5&AAsA47 1393C3CHDTDT3U3\3\3^ 0$(! 	s5   J; 3J; B?J; AJ; AJ; (AJ; 9A J; ;K c                    < V ^8  d   QhRS[ /# r-   r.   )r   r   s   "r   r   rJ      s      d r   c                    V P                   P                  V P                  R V P                  RR/^R7      pVe   VP                  ^8X  dn   RVP
                  9   d]   VP
                  P                  R4      V n        V P                   RV P                   RV P                   RV P                   2V n
        R# RV n        R#     R# ; i)r   r   r   )r   r   serviceTokenrL   TF)rV   r   r   re   r   r   rZ   rX   rY   rb   rS   r^   )r    r   s   & r   login_step_3&DreameVacuumCloudProtocol.login_step_3   s    	}}(( $//"$G  ) H #''3.>XEUEU3U*2*:*:*>*>~*ND'(,(;(;'<Adoo=NaPTP\P\~]^_c_n_n^o%pDN(,D% 	s   B6C :C Cc                    < V ^8  d   QhRS[ /# r-   r.   )r   r   s   "r   r   rJ     s      t r   c                0   V P                   P                  4        \        P                  ! 4       V n         V P                   P                  P                  R RRR7       V P                   P                  P                  R RRR7       V P                   P                  P                  RV P                  RR7       V P                   P                  P                  RV P                  RR7       V P                  ;'       d    V P                  4       ;'       gA    V P                  4       ;'       d)    V P                  4       ;'       d    V P                  4       pV'       d)   RV n        RV n        ^ V n        RV n        V P                  # RV n        V P                  # )	
sdkVersionz3.8.6zmi.com)domainz
xiaomi.comr   TFN)rV   closerT   rU   r   setrb   rX   r   r   r   r   r]   r^   rl   rm   )r    r   s   & r   loginDreameVacuumCloudProtocol.login  s=    ((*!!,!I!!,!M!!*dooh!O!!*dool!S__;;)9)9); 
 
OOD$5$5$7OOD<M<M<O 	 "DO %D D"DO  #DOr   c                    < V ^8  d   QhRS[ /# r-   r.   )r   r   s   "r   r   rJ   )  s     5 54 5r   c                "   R pV'       Edd   V P                   '       EdQ   V P                  '       Ed>   W P                   9   Ed-    V P                  P                  V P                   P                  VR4      ^R7      pV'       Ed   VP                  ^8X  Ed   VP
                  P                  R4      pV'       Ed   V P                  VP                  4      P                  R^4      pV P                  P                  V P                   P                  TV^8X  d   RMR4      R\        \        P                  ! 4       R,          4      /R	VR
VRRRR/RV/^R7      pV'       Ed   VP                  ^8X  d   V P                  VP                  4      pVP                  R4      ^ 8X  d   RV9   d   V P                  P                  VR,          R^R7      pV'       dv   VP                  ^8X  de   RV n         RV n        V P                  4       ;'       d    V P                  4       V n        V P                  '       d   RV n        ^ V n        RV n        R# R# \$        P'                  RVP                  4       R# R#   \(         d   p\+        RT4      RhRp?ii ; i)zfe/service/identity/authStartzidentity/listr   identity_sessionflagz/identity/auth/verifyPhonez/identity/auth/verifyEmailr   r   _flagtickettrustr   r   )r   rv   r   r   r   r   T)allow_redirectsr   NFz2FA Verification Failed! %s)rj   rV   r   replacer   r   r   r   r   rt   rn   captcha_urlr   r   r]   r^   rl   rm   _LOGGERwarning	Exceptionr
   )r    r   pathr   r   r   rv   exs   &&      r   verify_code%DreameVacuumCloudProtocol.verify_code)  sG   .4D)))dmmmH]H]@]1S==,,))11$H -  8 4 4 ;'/'7'7';';<N'O$''#||HMM:>>vqI#'==#5#5 1199 $AE!=Pl
 !&s499;+='>$ !( ($ ' '	" !34D% %&# $6 $( $8(<(<(C#'<<#>D#xx/14t9K+/==+<+<$($448,- ,= ,"
 $,0D0D0K<@D$97;D$46:6G6G6I6a6adN_N_NaDO'+<A(9;<(8:>+/
  !(0Mx}} ]   S%&CRHdRSs=   ?I1 5I1 :DI1 5I1 'I1 4I1  I1 1J<J		Jc                    < V ^8  d   QhRS[ /# r-   r.   )r   r   s   "r   r   rJ   `  s     8 8d 8r   c                Z    Wn         V P                  4       ;'       g    V P                  R J # r1   )r\   r   rk   )r    r   s   &&r   verify_captcha(DreameVacuumCloudProtocol.verify_captcha`  s'    !zz|77t//477r   c                ,   < V ^8  d   QhRS[ RS[RS[/# )r   r   r   r   )r   rt   r   )r   r   s   "r   r   rJ   d  s"      C c # r   c                :   ^ pV'       d   V^ 8  d   ^ pW2^,           8  dK    V P                   P                  V^R7      pVe   VP
                  ^8X  d   VP                  # V^,           pKW  R#   \         d#   pRp\        P	                  RY4        Rp?LVRp?ii ; i)r   r   NzUnable to get file at %s: %s)rV   r   r   r   r   r   r   )r    r   r   retriesr   r   s   &&&   r   get_file"DreameVacuumCloudProtocol.get_filed  s    kAoKa'I==,,S!,< #(<(<(C'''kG  I >HHIs   A- -B8BBc                &   < V ^8  d   QhRS[ RS[/# r   r   r   r   r   )r   r   s   "r   r   rJ   s  s     
- 
- 
-S 
-r   c                   T P                  R V P                  '       d   RMR 2RV/4      p\        P                  RW4       Ve   RV9  g   RVR,          9  d`   V'       dV   VP	                  R4      R8X  d@   V P                  '       d.   \        P                  R	4       R
V n        V P                  V4      # R# VR,          R,          # )zhome/getfileurlri   r%   obj_namezGet file url result: %s = %sNresultr   r   zget_file_url fallback to V2F)r   ri   r   debugr   infoget_file_urlr    r   api_responses   && r   r  &DreameVacuumCloudProtocol.get_file_urls  s    ~~$(((PR7T&UXbdoWpq4kP8<#?5P\]ePfCf 0 0 8B >4888:; ((55H%e,,r   c                &   < V ^8  d   QhRS[ RS[ /# r  r   )r   r   s   "r   r   rJ     s     - - -S -r   c                   T P                  R V P                  '       d   RMR 2RV/4      p\        P                  RW4       Ve&   VP	                  R4      '       d   RVR,          9  d`   V'       dV   VP	                  R4      R8X  d@   V P                  '       d.   \        P                  R	4       R
V n        V P                  V4      # R# VR,          R,          # )zv2/home/get_interim_file_url_pror%   r  z$Get interim file url result: %s = %sNr  r   r   z#get_interim_file_url fallback to V2Fr  )r   ri   r   r	  r   r
  get_interim_file_urlr  s   && r   r  .DreameVacuumCloudProtocol.get_interim_file_url  s    ~~*dhhhFB*HI%
 	<kX|'7'7'A'AUR^_gRhEh 0 0 8B >4888BC 00==H%e,,r   c                &   < V ^8  d   QhRS[ RS[/# )r   r   r   rt   r   )r   r   s   "r   r   rJ     s     & &C & &r   c                v    V P                  R V P                   2RVRV/V4      pVe   RV9  d   R# VR,          # )zv2/home/rpc/methodr   Nr  r   r`   )r    r  
parametersr   r  s   &&&& r   sendDreameVacuumCloudProtocol.send  sJ    ~~499+&vx4

 8<#?H%%r   c                *    V P                  VR W#V4      # )propget_device_datar    keylimit
time_starttime_ends   &&&&&r   get_device_property-DreameVacuumCloudProtocol.get_device_property  s    ##CHMMr   c                *    V P                  VR W#V4      # )eventr  r   s   &&&&&r   get_device_event*DreameVacuumCloudProtocol.get_device_event  s    ##C%XNNr   c                    V P                  R R\        V P                  4      R\        V P                  4      RVRVRVRVRV/4      pVe   R	V9  d   R# VR	,          # )
zuser/get_user_device_datauiddidr$  r#  r"  r!  typeNr  )r   r   r_   r`   )r    r!  r.  r"  r#  r$  r  s   &&&&&& r   r  )DreameVacuumCloudProtocol.get_device_data  sh    ~~'s499~s499~Hjs
 8<#?H%%r   c                \   < V ^8  d   QhRS[ RS[S[S[ ,          S[S[ ,          3,          /# )r   macr   )r   r   r   )r   r   s   "r   r   rJ     s-     
 
C 
E(3-#*F$G 
r   c                  a V P                  4       pV'       d   \        \        V3R  lV4      4      p\        V4      ^ 8  d   V^ ,          R,          V n        V^ ,          R,          V n        \        RV^ ,          9   ;'       d    RV^ ,          R,          9   4      V n        V^ ,          R,          V^ ,          R,          3# R# )c                 .   < \        V R ,          4      S8H  # r1  r   )dr1  s   &r   <lambda>4DreameVacuumCloudProtocol.get_info.<locals>.<lambda>  s    #ah-3*>r   r,  r-  modelzxiaomi.vacuum.r   localipNN)get_deviceslistfilterrd   r_   r`   r/   ri   )r    r1  devicesfounds   &f  r   get_info"DreameVacuumCloudProtocol.get_info  s    ""$ >HIE5zA~!!HUO	!!HUO	58 3 ] ]8HERSHU\L]8]^Qx(%(9*===r   c                    < V ^8  d   QhRS[ /# r-   r   )r   r   s   "r   r   rJ     s     0, 0,C 0,r   c                   V P                  4       p. p. pV'       Ed   \        \        R  V4      4      pV Fz  pVR,          p	W9   dO   VP                  V4       Ve   VP	                  R4      V8X  g   Ve   VP	                  R4      V8X  d   V.p M"K^  K`  RV	9   g   Ki  VP                  V4       K|  	  VEf    \
        P                  ! RR4      p
V F  pVR,          p	RV	9   g   K  \        P                  ! VR,          P                  RR4      P                  4       P                  R	R
7      4      P                  4       p\        P                  ! \        P                   ! \"        4      \        P                   ! \$        4      P'                  R4      P)                  T\*        T	T
W9   d   RMR4      ^R7       K  	  WV3# WV3#     YV3# ; i)c                 .    V P                  R 4      '       * # )	parent_id)r   )r5  s   &r   r6  ADreameVacuumCloudProtocol.get_supported_devices.<locals>.<lambda>  s    !%%"44r   r8  r9  r1  z.vacuum.r    r   r%   UTF-8encodingutf-8deviceunsupported_devicerv   r   )r;  r<  r=  appendr   randomrandintr   sha256r   lowerr   r   rT   r   r   	b64decodeDATA_URL	DATA_JSONr   r   r   )r    modelshostr1  r   r>  unsupported_devicesall_devicesrM  r8  
session_idrI   s   &&&&        r   get_supported_devices/DreameVacuumCloudProtocol.get_supported_devices  s   ##% 84K &w?NN6*(VZZ	-Bd-JFJJu,=,D#)( -E  5('..v6 & {!'i!@J"- &w%.(/!'!6!6sB!?!E!E!G O OY` O a)'ik & %MM & 0 0 :%+%5%5i%@!'!'$-$+$)$.05HEY"" )* #.* ++w++++s   :)G (CG Gc                    < V ^8  d   QhRS[ /# r-   rC  )r   r   s   "r   r   rJ     s     M MS Mr   c                  a . pV P                  R RRRRRRR^dR^/4      pV'       Ed@   RV9   Ed6   VR,          '       Ed$   / pVR,          P                  R4       F  pV P                  W4R	,          &   K  	  V P                  R
RRRR/4      pV'       dt   RV9   dm   VR,          '       d^   RVR,          9   dP   VR,          R,          '       d:   VR,          R,          P                  R4       F  oSR,          VSR,          &   K  	  V'       d   VP                  4        F  w  rVV P                  RR\	        V4      RVR^dRRRR/4      pV'       g   K4  RV9   g   K=  VR,          '       g   KN  RVR,          9   g   K^  VR,          R,          '       g   Kv  VP                  VR,          R,          4       K  	  V P                  RRRR^ /4      pV'       d   RV9   d   VR,          '       dv   RVR,          9   dh   VR,          R,          '       dR   VR,          R,           F=  o\        \        \        V3R lV4      4      4      ^ 8X  g   K,  VP                  S4       K?  	  V# R# R# R# )zv2/homeroom/gethomefgTfetch_sharefetch_share_devr"  app_verr  homelistidzv2/user/get_device_cnt	fetch_ownshareshare_family
home_ownerhome_idzv2/home/home_device_listget_split_devicesupport_smart_homedevice_infozhome/device_listgetVirtualModelFgetHuamiDevicesr<  c                 <   < \        V R ,          4      SR ,          8H  # r4  r   )r5  rM  s   &r   r6  7DreameVacuumCloudProtocol.get_devices.<locals>.<lambda>2  s    c!E(mve}.Lr   N)
r   r   rY   itemsrt   extendrd   r<  r=  rP  )r    device_listr   homeshomekvrM  s   &      @r   r;  %DreameVacuumCloudProtocol.get_devices  sW   >>!dt!41	
 8H,(1C1CE *..z:$(LL4j! ; ~~(!4H (X&&x11X&w//&x09==nMF/5l/CE&+, N !KKMDA#~~2%s1v(!#S.0$	 H !$0$X..)Xh-??$X.}==#**8H+=m+LM% *( ~~&8;LeUfhi:jkH(X&&hx00X&v..&x088F  &$L$/!"  $**62 9 C 2D,8r   c                    < V ^8  d   QhRS[ /# r-   rC  )r   r   s   "r   r   rJ   =  s     ' 's 'r   c                    V P                  R RV P                  RV/.4      pVe   V P                  V9  d   R# W P                  ,          # )zdevice/batchdevicedatasr-  propsNr  r    r}  r  s   && r   get_batch_device_datas0DreameVacuumCloudProtocol.get_batch_device_datas=  sF    ~~&?5$))U\^cBdAef499L#@II&&r   c                    < V ^8  d   QhRS[ /# r-   rC  )r   r   s   "r   r   rJ   C  s     & &s &r   c                p    V P                  R RV P                  RV/.4      pVe   RV9  d   R# VR,          # )zv2/device/batch_set_propsr-  r}  Nr  r  r~  s   && r   set_batch_device_datas0DreameVacuumCloudProtocol.set_batch_device_datasC  s@    ~~&AUDIIW^`eDfCgh8<#?H%%r   c                B   < V ^8  d   QhRS[ RS[S[ S[ 3,          RS[/# )r   r   r   r   )r   r   r   )r   r   s   "r   r   rJ   I  s*     0 03 0S#X 0# 0r   c                   ^ pV'       d   V^ 8  d   ^ pRV P                   RRRRRRRR	/pR
\        V P                  4      RV P                  RV P                  R\        V P                  4      R\        V P
                  4      R\        \        P                  4      R\        \        P                  ! 4       P                  ^<,          ^<,          R,          4      RR/pV P                  4       pV P                  V4      pV P                  VRWW P                  4      p	WC^,           8  d!    V P                  P                  WWi^R7      p
 X
e   V
P(                  ^8X  da   ^ V n        RV n        V P-                  V P                  V	R,          4      V
P.                  4      pV'       d   \0        P2                  ! V4      # R# \$        P'                  RV
P.                  4       V P*                  ^8X  d
   RV n        R# V P*                  ^,           V n        R#   \          dQ   pT^,           pRp
T P"                  '       d(   \$        P'                  RT\        T4      4        Rp?EKE   Rp?EKL  Rp?ii ; i)r   r   zAccept-Encodingidentityzx-xiaomi-protocal-flag-clizPROTOCAL-HTTP2zcontent-typer   zMIOT-ENCRYPT-ALGORITHMzENCRYPT-RC4r   yetAnotherServiceTokenr   rf   rq   is_daylight
dst_offsetr   channelMI_APP_STOREPOST)r   r   rv   r   Nz$Error while executing request: %s %sT_noncez)Execute api call failed with response: %sF)re   r   rY   rZ   rh   ru   rn   daylightro   rp   generate_noncesigned_noncegenerate_enc_paramsrX   rV   r   r   rm   r   r   r   rl   decrypt_rc4r   r   loads)r    r   r   r   r   r   r   noncer  fieldsr   r   decodeds   &&&&         r   r   !DreameVacuumCloudProtocol.requestI  s   kAoK$//z(*:?$m
 c$,,'$d&9&9D//c$,,'DNN+3t}}-#dnn.77"<rADHI~	
 ##%((/))#v|FTcTcda'Z==--cGjk-l ##s*#$ "&**4+<+<VH=M+NPXP]P]^.5tzz'*?4?OOGWq #DO   $//!3D%  Z!A+???OO$JCQTUWQXYY #Zs   (H I+=I&&I+c                    < V ^8  d   QhRS[ /# r-   r   )r   r   s   "r   r   rJ   {  s     f fS fr   c                \    R V P                   R8X  d   R R2# V P                   R,            R2# )zhttps://cnr%   .zapi.io.mi.com/app)rR   r3   s   &r   r   %DreameVacuumCloudProtocol.get_api_url{  s5    $!62SSdeeT]]S=PSSdeer   c                &   < V ^8  d   QhRS[ RS[ /# )r   r  r   r   )r   r   s   "r   r   rJ   ~  s     F F# F# Fr   c                   \         P                  ! \        P                  ! V P                  4      \        P                  ! V4      ,           4      p\        P
                  ! VP                  4       4      P                  R 4      # )rL  )r   rS  r   rU  rX   r   digestr   )r    r  hash_objects   && r   r  &DreameVacuumCloudProtocol.signed_nonce~  sU    nnV%5%5doo%FIYIYZ_I`%`a 2 2 45<<WEEr   c                d    V P                   P                  4        R V n        R V n        R V n        R# r7   )rV   r   rm   r]   r^   r3   s   &r   r8   $DreameVacuumCloudProtocol.disconnect  s(    !r   c                    \        \        \        P                  ! 4       R ,          4      4      p \        P                  ! ^@4      R,
          P                  ^RRR7      p\        V R,          4      pWP                  VP                  4       ^,           ^,          R4      ,          p\        P                  ! V4      P                  R4      # )r   bigT)signedi`  rL  l            )
rt   roundrn   rQ  getrandbitsto_bytes
bit_lengthr   r   r   )millisbpart2s      r   r  (DreameVacuumCloudProtocol.generate_nonce  s    U499;-./#e+55at5LFUN#	^^e..014:UCC"))'22r   c                    < V ^8  d   QhRS[ /# r-   r   )r   r   s   "r   r   rJ     s     J J Jr   c                 D    R P                  R \        ^4       4       4      # )r%   c              3   b   "   T F%  p\        \        P                  ! ^a^z4      4      x  K'  	  R# 5i)a   N)chrrQ  rR  ).0_s   & r   	<genexpr>?DreameVacuumCloudProtocol.generate_client_id.<locals>.<genexpr>  s#     HiFNN2s344is   -/)joinrange r   r   ra   ,DreameVacuumCloudProtocol.generate_client_id  s    wwHeBiHIIr   c                H   < V ^8  d   QhRS[ RS[ RS[S[ S[ 3,          RS[ /# )r   r  r  r   r   r   r   )r   r   s   "r   r   rJ     s3     
= 
=c 
=# 
=tCQTH~ 
=Z] 
=r   c                   V P                  R 4      ^,          W.pVP                  4        F  w  rVVP                  V RV 24       K  	  RP                  V4      p\        P
                  ! \        P                  ! V4      VP                  4       \        P                  R7      p\        P                  ! VP                  4       4      P                  4       # )com=&)msg	digestmod)rc   rs  rP  r  hmacnewr   rU  r   r   rS  r   r  r   )	r   r  r  r   signature_paramsrx  ry  signature_string	signatures	   &&&&     r   generate_signature,DreameVacuumCloudProtocol.generate_signature  s    IIe,Q/ELLNDA##qc1#J/ #88$45HH\* '')nn
	
 	 0 0 23::<<r   c                H   < V ^8  d   QhRS[ RS[ RS[S[ S[ 3,          RS[ /# )r   r  r  r   r   r  )r   r   s   "r   r   rJ     s;     	b 	bC 	bs 	bDQTVYQYN 	b_b 	br   c                   \        V4      P                  4       V P                  R 4      ^,          P                  RR4      .pVP	                  4        F  w  rVVP                  V RV 24       K  	  VP                  V4       RP                  V4      p\        P                  ! \        P                  ! VP                  R4      4      P                  4       4      P                  4       # )r  z/app/rz   r  r  rL  )r   r   rc   r   rs  rP  r  r   r   r   sha1r   r  r   )r   r  r  r   r  rx  ry  r  s   &&&&    r   generate_enc_signature0DreameVacuumCloudProtocol.generate_enc_signature  s     KIIeQ''5
 LLNDA##qc1#J/ #-88$45-=-D-DW-M N U U WX__aar   c                p   < V ^8  d   QhRS[ RS[ RS[ RS[ RS[S[ S[ 3,          RS[ RS[S[ S[ 3,          /# )r   r   r  r  r  r   r   r   r  )r   r   s   "r   r   rJ     s_        	
 S#X  
c3hr   c           	         \         P                  WW$4      VR &   VP                  4        F  w  rg\         P                  W'4      WF&   K  	  VP	                  R\         P                  WW$4      RVRV/4       V# )
rc4_hash__r  r   r  )rC   r  rs  encrypt_rc4update)r   r  r  r  r   r   rx  ry  s   &&&&&&  r   r  -DreameVacuumCloudProtocol.generate_enc_params  sw      9OOPS]ir|LLNDA1==lNFI #6MMc[gpY%	
 r   c                &   < V ^8  d   QhRS[ RS[/# )r   response_textr   r  )r   r   s   "r   r   rJ     s     D Ds Ds Dr   c                N    \         P                  ! V P                  R R4      4      # )z&&&START&&&r%   )r   r  r   )r  s   &r   r   !DreameVacuumCloudProtocol.to_json  s    zz-//rBCCr   c                ,   < V ^8  d   QhRS[ RS[ RS[ /# r   rF   payloadr   r   )r   r   s   "r   r   rJ     s'     F Fc FC FC Fr   c                   \         P                  ! \        P                  ! V 4      4      pVP	                  \        R 4      4       \        P                  ! VP	                  VP                  4       4      4      P                  4       # i   )	r   r  r   rU  encryptr(   r   r   r   rF   r  rs   && r   r  %DreameVacuumCloudProtocol.encrypt_rc4  sU    HHV%%h/0			%+		'..*: ;<CCEEr   c                ,   < V ^8  d   QhRS[ RS[ RS[/# r  )r   r(   )r   r   s   "r   r   rJ     s"     4 4c 4C 4E 4r   c                    \         P                  ! \        P                  ! V 4      4      pVP	                  \        R 4      4       VP	                  \        P                  ! V4      4      # r  )r   r  r   rU  r  r(   r  s   && r   r  %DreameVacuumCloudProtocol.decrypt_rc4  sE    HHV%%h/0			%+yy))'233r   )r^   rS   r\   r[   rb   rm   rR   r`   rl   rh   r   r]   rQ   rZ   rV   rW   rX   ru   r_   rY   re   rP   ri   rk   r   rj   r:  )r   r1   )r   )r%   )   r   l   c(	 )/r:   r;   r<   r=   r   r   r>   r   r   r4   rI   rH   r   r   r   r   r   r   r   r   r   r  r  r  r%  r)  r  r@  r]  r;  r  r  r   r   r  r8   staticmethodr  ra   r  r  r  r   r  r  r?   r@   r   s   @r   rC   rC   5   s    )) ))V   ! !       6 6 > 2> >@ * ,5 5n8 8 
- 
-- -& &NO&$
 
0, 0,dM M^' '& &0 0df fF F" 3 3 J J 
= 
= 	b 	b  ( D D F F
 4 4r   rC   c                      a  ] tR tRt o RV 3R lR lltRV 3R lR lltRV 3R lR lltR	 tRV 3R
 lR lltRV 3R lR llt	RV 3R lR llt
RV 3R lR llt. ^3V 3R lR llt]V 3R lR l4       tRtV tR# )DreameVacuumProtocoli  Nc                N   < V ^8  d   QhRS[ RS[ RS[ RS[ RS[ RS[RS[ RS[ R	R
/	# )r   r   r   rE   rF   rG   prefer_cloudrI   rH   r   N)r   r/   )r   r   s   "r   r   !DreameVacuumProtocol.__annotate__  sp     w ww w 	w
 w w w w w 
wr   c	                P   R V n         W`n        R V n        RV n        V'       d   V'       d   \	        W4      V n        MRV n        RV n        V'       d$   V'       d   V'       d   \        W4WXV4      V n        MR V n        RV n        V'       d   \        W4WX4      V n        R# RV n        R# )FNT)	_readyr  rm   _macr   rM  rC   clouddevice_cloud)	r    r   r   rE   rF   rG   r  rI   rH   s	   &&&&&&&&&r   r   DreameVacuumProtocol.__init__  s     (	%4R?DK $DDKW28wZcdDJ %DDJ`l5h'\rvr   c                ,   < V ^8  d   QhRS[ RS[ RS[ /# )r   r   r   r1  r   )r   r   s   "r   r   r    s"      # c  r   c                    W0n         V'       dJ   V'       dB   V P                  '       d   V P                  P                  W4       R # \        W4      V n        R # R V n        R # r1   )r  rM  r   r   )r    r   r   r1  s   &&&&r   r   $DreameVacuumProtocol.set_credentials  s:    	%{{{++B68CDKr   c                    < V ^8  d   QhRS[ /# r-   rC  )r   r   s   "r   r   r    s      X[ r   c                   V P                  R VR7      pV'       d>   V P                  '       g   V P                  '       g   V P                  '       d   RV n        V'       Ed	   V P
                  '       g    \        P                  ! VR,          P                  RR4      P                  4       P                  RR7      4      P                  4       p\        P                  ! \        P                  ! \         4      \        P                  ! \"        4      P%                  R4      P'                  V\(        VR	,          \*        P,                  ! R
R4      R4      ^R7      pV'       d   RV n        V# V#     T# ; i)z	miIO.infor   Tr1  r   r%   rI  rJ  rL  r8  r   rH  connectrO  )r  r  rM  r  rm   r  r   rS  r   rT  r   r   rT   r   r   rU  rV  rW  r   r   r   rQ  rR  )r    message_callbackconnected_callbackr   r
  rI   r   s   &&&&   r   r  DreameVacuumProtocol.connect  s   yy+y>T&&&dkkkt?P?P?P"DO4#NNDK,?,?R,H,N,N,P+X+Xbi+X+jkuuw	#==$$X.)))4VG_V!WtY7!  "&DK ts   5C+E, !E, ,E1c                   V P                   e   V P                   P                  4        V P                  e   V P                  P                  4        V P                  e   V P                  P                  4        RV n        R # )NF)rM  r8   r  r  rm   r3   s   &r   r8   DreameVacuumProtocol.disconnect  s[    ;;"KK""$::!JJ!!#(((*r   c                ,   < V ^8  d   QhRS[ RS[RS[ /# r   r  r   r   r   rt   )r   r   s   "r   r   r     s'     \ \s \ \C \r   c                   V P                   '       g   V P                  '       Egn   V P                  '       Ed[   V P                  P                  '       g   V P                  P	                  4        V P                  P                  '       d   V P                  P
                  '       gz   V P                  P
                  '       d'   V P                  P
                  V P                  n        M7V P                  '       d&   V P                  P                  V P                  4       V P                  P                  '       g   \        R 4      RhV P                  P                  WVR7      pVf"   VR8X  g   VR8X  d   RV n        \        R4      RhRV n        V# V P                  '       d   V P                  P                  WVR7      # R# )z$Unable to login to device over cloudNr  r   get_propertiesset_propertiesFz(Unable to discover the device over cloudT)r  rM  r  r   r   rI   r  r`   r  r@  r
   r  rm   )r    r  r  r   r   s   &&&& r   r  DreameVacuumProtocol.send   sO   T[[[d6G6G6G$$...!!'')$$...t7H7H7R7R7Rzz+++151E1E)).))22499=$$...%&LMSWW((--fYd-eH--;K1K&+DO%&PQW[["DOO;;;;;##F{#[[ r   c                ,   < V ^8  d   QhRS[ RS[RS[ /# r  r  )r   r   s   "r   r   r  9  '     [ [ [# [c [r   c                (    V P                  R WR7      # )r  r  r  r    r  r   s   &&&r   r  #DreameVacuumProtocol.get_properties9      yy)jyZZr   c          
      8   < V ^8  d   QhRS[ RS[ RS[RS[ RS[/# )r   siidpiidvaluer   r   r  )r   r   s   "r   r   r  <  s2     
 
 
C 
 
QT 
]` 
r   c           
     D    V P                  R V RV 2RVRVRV/.VR7      # )r-  r  r  r  r  r  )r  )r    r  r  r  r   s   &&&&&r   set_property!DreameVacuumProtocol.set_property<  sJ    "" dV1TF+DDU	 $ # 

 
	
r   c                ,   < V ^8  d   QhRS[ RS[RS[ /# r  r  )r   r   s   "r   r   r  I  r
  r   c                (    V P                  R WR7      # )r  r  r  r  s   &&&r   r  #DreameVacuumProtocol.set_propertiesI  r  r   c                2   < V ^8  d   QhRS[ RS[ RS[ RS[/# )r   r  aiidr   r   r  )r   r   s   "r   r   r  L  s*     
 
3 
c 
s 
SV 
r   c                ~    Vf   . p\         P                  RWV4       V P                  RRV RV 2RVRVRV/VR7      # )	NzSend Action: %s.%s %sactionr-  r  r  r  inr  )r   r	  r  )r    r  r  r  r   s   &&&&&r   r  DreameVacuumProtocol.actionL  s`    J-t:Fyy$q'j	 $  	
 		
r   c                    < V ^8  d   QhRS[ /# r-   r.   )r   r   s   "r   r   r  ]  s      4 r   c                R   V P                   '       g   V P                  '       g[   V P                  '       dI   V P                  P                  ;'       d+    V P                  P                  ;'       d    V P
                  # V P                  '       d   V P                  P                  # R # )F)r  rM  r  r   r4   rm   r3   s   &r   r4   DreameVacuumProtocol.connected\  sr    T[[[d6G6G6G$$..bb43D3D3N3NbbSWSbSbb;;;;;(((r   )rm   r  r  r  rM  r  r  )NNNNNFNNr1   )NNr  )Nr   )Nr  )r:   r;   r<   r=   r   r   r  r8   r  r  r  r  r  r>   r4   r?   r@   r  s   @r   r  r    s}     w w<  6 \ \2[ [
 
[ [ 79Q 
 
   r   r  c                h    V ^8  d   Qh/ ^ \         9   d
   \        ;R&   ^\         9   d
   \        ;R&   # )r   rV  rW  )__conditional_annotations__r   )r   s   "r   r   r      s2      % ! & 5 ' r   )!r$  loggingrQ  r   r   r   r  rT   rn   rf   typingr   r   r   r   r   Crypto.Cipherr   miio.miioprotocolr	   
exceptionsr
   r%   r   rV  rW  	getLoggerr:   r   r   rC   r  r   )r$  s   @r   <module>r+     s            4 4  * '  S 	  W 
  

H
%! !4[
4 [
4|Q Qr   