
    |e-                     ,   d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z	m
Z
 ddlmZmZmZ ddlmZmZmZmZ  ej        e          Zg dZdd	d
ddZdddddZdddddZddgZ G d de          Z G d d          Z G d dee          ZdS )zJ
https://coolkit-technologies.github.io/eWeLink-API/#/en/PlatformOverview
    N)OptionalDict)ClientConnectorErrorClientWebSocketResponse	WSMessage   )SIGNAL_CONNECTEDSIGNAL_UPDATEXDeviceXRegistryBase)   <   i,  i  i  zhttps://cn-apia.coolkit.cnzhttps://as-apia.coolkit.cczhttps://us-apia.coolkit.cczhttps://eu-apia.coolkit.cc)cnasuseuz(https://cn-dispa.coolkit.cn/dispatch/appz(https://as-dispa.coolkit.cc/dispatch/appz(https://us-dispa.coolkit.cc/dispatch/appz(https://eu-dispa.coolkit.cc/dispatch/apponlineofflinetimeoutunknown)r   i  i  N) 4s1FXKC9FaGfoqXhmXSJneb3qcm1gOak oKvCM06gvwkRbfetd6qWRrbC3rFrbIpV) R8Oq3y0eSZSYdKccHlrQzT1ACCOUT9Gv 1ve5Qk9GXfUhKAn1svnKwpAlxXkMarruc                       e Zd ZdS )	AuthErrorN)__name__
__module____qualname__     6/config/custom_components/sonoff/core/ewelink/cloud.pyr   r   .   s        Dr!   r   c                   `    e Zd ZU dZi Zeeej        f         e	d<   dede
defdZdedefdZd	S )
ResponseWaiterz0Class wait right sequences in response messages._waiterssequenceerrorreturnc                     || j         vrdS 	 |t          v rt          |         nd| }| j         |                             |           dS # t          $ r Y dS w xY w)NFzE#T)r%   
DATA_ERROR
set_result	Exception)selfr&   r'   results       r"   _set_responsezResponseWaiter._set_response7   sz    4=((5	*/:*=*=Z&&<<<FM(#..v6664 	 	 	55	s   ;A
 

AAr   c                   K   t          j                                                    x| j        |<   }	 t          j        ||           d {V  n1# t           j        $ r Y | j                            |d           }dS w xY w	 | j                            |d           }n # | j                            |d           }w xY w|                                S )Nr   )asyncioget_event_loopcreate_futurer%   wait_forTimeoutErrorpopr.   )r-   r&   r   fut_s        r"   _wait_responsezResponseWaiter._wait_responseC   s      (/(>(@(@(N(N(P(PPh#	2"30000000000# 	 	 	 !!(D11AAA		 1
 !!(D11AA!!(D11A1111 zz||s)   A B A=B <A==B B:N)r   r   r   __doc__r%   r   strr1   Future__annotations__intboolr/   floatr9   r    r!   r"   r$   r$   2   s         ::*,Hd3&',,,
c 
# 
$ 
 
 
 
S 5      r!   r$   c            	          e Zd ZU dZeed<   dZeed<   dZdZdZ	dZ
eej                 ed<   dZeed<   edefd	            Zedefd
            Zedefd            Zedefd            Zd$dededefdZd$dededefdZdefdZd%dedee         fdZ	 	 	 d&dedededefdZd Z d Z!dee         fdZ"d  Z#defd!Z$d"efd#Z%dS )'XRegistryCloudNauthdevicesr   r   taskwsr(   c                 &    t           | j                 S N)APIregionr-   s    r"   hostzXRegistryCloud.host]   s    4;r!   c                 &    t           | j                 S rH   )WSrJ   rK   s    r"   ws_hostzXRegistryCloud.ws_hosta   s    $+r!   c                 &    dd| j         d         z   iS )NAuthorizationBearer at)rC   rK   s    r"   headerszXRegistryCloud.headerse   s    TYt_!<==r!   c                 2    | j         dz   | j        d         z   S )N:rS   )rJ   rC   rK   s    r"   tokenzXRegistryCloud.tokeni   s    {S 49T?22r!   usernamepasswordc                    K   |dk    r9|                     d          \  | _        }|                     |d           d {V S |dd}d|v r||d<   n#|                    d          r||d	<   nd|z   |d	<   t          |         \  }}t          j        |                                          }t          j	        |                                |t          j                                                  }	d
t          j        |	                                          z   d|d}
| j                            | j        dz   ||
d           d {V }|                                 d {V }|d         dk    rY|d         d         | _        | j                            | j        dz   ||
d           d {V }|                                 d {V }|d         dk    rt'          |d                   |d         | _        || j        d<   dS )NrW   rV   r   z+86)rY   countryCode@email+phoneNumberzSign zapplication/json)rQ   zContent-Type
X-CK-Appidz/v2/user/login   )datarT   r   r'   i'  rb   rJ   r   msgappidT)splitrJ   login_token
startswithAPPjsondumpsencodehmacnewhashlibsha256digestbase64	b64encodedecodesessionpostrL   r   rC   )r-   rX   rY   apprW   payloadrd   	appsecretrb   hex_digrT   rresps                r"   loginzXRegistryCloud.loginm   sf     w!)!4!4DK))%333333333 ! 
 
 (??'GG  %% 	4%-GM""%(8^GM"s8y z'""))++(9++--tW^DDKKMM %v'7'@'@'G'G'I'II.
 

 ,##I((tWb $ 
 
 
 
 
 
 
 
 VVXX~~~~~~ =E!!v,x0DKl''	,,4RT (        A >>>>>>D=ADK(((L	"	'tr!   rW   rv   c                 N  K   t           |         d         }d|z   |d}| j                            | j        dz   |d           d {V }|                                 d {V }|d         dk    rt          |d                   |d	         | _        || j        d
<   || j        d<   dS )Nr   rR   )rQ   r`   z/v2/user/profilera   rT   r   r'   rc   rb   rS   rd   T)rh   rt   getrL   ri   r   rC   )r-   rW   rv   rd   rT   rz   r{   s          r"   rf   zXRegistryCloud.login_token   s      C$-$5UKK,""I**GR # 
 
 
 
 
 
 
 
 VVXX~~~~~~=ADK(((L		$"	'tr!   c                    K   | j                             | j        dz   | j        d           d {V }|                                 d {V }d |d         d         D             S )Nz
/v2/familyra   r~   c                 ,    i | ]}|d          |d         S )idnamer    .0is     r"   
<dictcomp>z,XRegistryCloud.get_homes.<locals>.<dictcomp>   s"    GGGq$6GGGr!   rb   
familyList)rt   r   rL   rT   ri   )r-   rz   r{   s      r"   	get_homeszXRegistryCloud.get_homes   s      ,""I$dlB # 
 
 
 
 
 
 
 
 VVXX~~~~~~GGDL,FGGGGr!   homesc           	      >  K   g }|pd gD ]}| j                             | j        dz   | j        d|rd|dnddi           d {V }|                                 d {V }|d         dk    rt          |d                   |d	 |d
         d         D             z  }|S )Nz/v2/device/thingra   r   )numfamilyidr   )rT   r   paramsr'   rc   c                 6    g | ]}|d          dk    |d         S )itemType   itemDatar    r   s     r"   
<listcomp>z.XRegistryCloud.get_devices.<locals>.<listcomp>   s5       Z=A%% *%%%r!   rb   	thingList)rt   r   rL   rT   ri   r,   )r-   r   rD   homerz   r{   s         r"   get_deviceszXRegistryCloud.get_devices   s      OdV 	 	Dl&&	..7;Kqd333%	 '        A >>>>>>DG}!!U,,,   fk2   GG
 r!      devicer   r&   r   c                   K   |d          d}|r|| dz  }t          j                     | j        z
  dk     r>|dz  }t          j        d           d{V  t          j                     | j        z
  dk     >t          j                     | _        ||                                 }||z  }|rdnd|d	         | j        d
         d	         |d         |pg d|d}t                              |           	 | j        	                    |           d{V  |r| 
                    ||           d{V S dS # t          $ r Y dS t          $ r'}t                              ||           Y d}~dS d}~ww xY w)zWith params - send new state to device, without - request device
        state. With zero timeout - won't wait response.
        deviceidz => Cloud4 | z | g?zDDoS | Nupdatequeryapikeyuserrv   )actionr   
selfApikeyr   r   	userAgentr&   r   exc_infozE#???)timelast_tsr1   sleepr&   rC   _LOGGERdebugrF   	send_jsonr9   ConnectionResetErrorr,   r'   )r-   r   r   r&   r   logrw   es           r"   sendzXRegistryCloud.send   s      
#222 	"f>>>!C ikkDL(3..9C-$$$$$$$$$ ikkDL(3.. y{{}}Hx #)5hhg X&)F+H5z*l 

 

 	c
	'##G,,,,,,,,, D!007CCCCCCCCCD D $ 	 	 	99 	 	 	MM#M***77777	s   0=D0 0
E-=	E-E((E-c                 \    t          j        |                                           | _        d S rH   )r1   create_taskrun_foreverrE   rK   s    r"   startzXRegistryCloud.start   s$    '(8(8(:(:;;			r!   c                    K   | j         r | j                                          d | _         |                     d            d S rH   )rE   cancel
set_onlinerK   s    r"   stopzXRegistryCloud.stop   sC      9 	IDIr!   valuec                     t                               d| j         d|            | j        |k    rd S || _        |                     t                     d S )NzCLOUD z => )r   r   r   dispatcher_sendr	   )r-   r   s     r"   r   zXRegistryCloud.set_online  s[    7t{7777888;%F-.....r!   c                   K   d}| j         j        s@|                                  d {V s{|                     d           t          |         }t
                              d| d           |dz   t          t                    k     r|dz  }t          j	        |           d {V  d}|                     d           	 | j
        2 3 d {V }t          j        |j                  }t          j        |                     |                     H6 n3# t           $ r&}t
                              d|           Y d }~nd }~ww xY w| j         j        >d S d S )	Nr   FzCloud connection retrying in z secondsr   TzCloud processing errorr   )rt   closedconnectr   RETRY_DELAYSr   r   lenr1   r   rF   ri   loadsrb   r   _process_ws_msgr,   warning)r-   failsdelayrc   r{   r   s         r"   r   zXRegistryCloud.run_forever  s     ,% 	F'''''' &&&$U+MeMMMNNN19s<0000QJEmE*********EOOD!!!F!% D D D D D D D#:ch//D'(<(<T(B(BCCCC ")  F F F 81EEEEEEEEF) ,% 	F 	F 	F 	F 	Fs%   ?D DAD 
E D;;E c                   K   	 | j                             | j        | j                   d {V }|                                 d {V }| j                             d|d          d|d          dd           d {V | _        t          j                    }d	| j        d
         | j        d         d         | j        d         t          t          |dz                      t          |          dt          t          |dz                      dd	}| j                            |           d {V  | j                                         d {V }d|v r|d         dk    rt          |          dS # t          $ r'}t                              d|            Y d }~n6d }~wt          $ r&}t                              d|           Y d }~nd }~ww xY wdS )N)rT   zwss://domainrV   portz/api/wsZ   )	heartbeat
userOnlinerS   r   r   rd   d   rv   i     )	r   rS   r   rd   noncetsr   r&   versionr'   r   TzCloud WS Connection error: zCloud WS exceptionr   F)rt   r   rO   rT   ri   
ws_connectrF   r   rC   r;   r>   r   receive_jsonr,   r   r   r   r'   )r-   rz   r{   r   rw   r   s         r"   r   zXRegistryCloud.connect'  s,     #	<l&&t|T\&JJJJJJJJA>>>>>>D !L33?h??$v,???2 4        DG
 B&io)F+H57+Sc]]++"gg"BI//
 
G '##G,,,,,,,,,--////////D$4=A#5#5oo%4# 	? 	? 	?OO=!==>>>>>>>> 	< 	< 	<MM.M;;;;;;;;	< us$   E+E1 1
G;FG*GGrb   c                 ^  K   d|vr|                      |d         |d                    d|v r|                     t          |           d S d|v r5|                    d          |d<   |                     t          |           d S |d         dk    rt                              d|            d S d S |d         dk    r|                     t          |           d S |d         d	k    r|                     t          |           d S |d         d
k    rd S t                              d|            d S )Nr   r&   r'   r   configr   zCloud ERROR: r   sysmsgreportSubDevicezUNKNOWN cloud msg: )r/   r   r
   r6   r   r   )r-   rb   s     r"   r   zXRegistryCloud._process_ws_msgO  s]     4tJ/g??? 4$$]D99999T!!!%(!3!3X$$]D99999g!## 6 6 677777 $# (^x''  55555(^x''  55555(^000D OO8$8899999r!   )r   rH   )NNr   )&r   r   r   rC   dictr=   rD   r   r   rJ   rE   r   r1   TaskrF   r   propertyr;   rL   rO   rT   rW   r?   r|   r>   rf   r   listr   r   r@   r   r   r   r   r   r   r   r    r!   r"   rB   rB   S   s        D$GTGFF#'D(7<
 '''"&B&&& c       X      X > > > > X> 3s 3 3 3 X3/ /C /3 /$ / / / /b s  T     H H H H H t tDz    0 0 00 0 	0
 0 0 0 0d< < <  / / / / /F F F4&t & & & &P:$ : : : : : :r!   rB   ) r:   r1   rq   rn   rl   ri   loggingr   typingr   r   aiohttpr   r   r   baser	   r
   r   r   	getLoggerr   r   r   rI   rN   r*   rh   r,   r   r$   rB   r    r!   r"   <module>r      s           ! ! ! ! ! ! ! ! L L L L L L L L L L I I I I I I I I I I I I
'
H
%
%111 '
&
&
&	  5
4
4
4	  		KK

 ML		 	 	 	 		 	 	 	       BW: W: W: W: W:^] W: W: W: W: W:r!   