
    |e+                     <   d dl Z d dlZd dlZd dlmZ d dlmZmZm	Z	 d dl
mZmZmZmZmZmZmZmZmZmZ d dlmZmZ d dlmZmZ d dlmZ d dlmZ d d	l m!Z" d d
l#m$Z$ ddl%m&Z& ddl'm(Z( ddl'm)Z* ddl+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9m:Z:  ej;        e<          Z=g dZ> ej?        e1 ej?         ej@        e,          ejA         ej@        e-          ejA         ej@        e          ejA         ej@        e          ejA         ej@        e.          ejA         ej@        e          ejB         ej@        e0          ejA         ej?         ej@        e          ejA         ej@        e          ejA         ej@        ed          ejC         ej@        e          ejA        iejD                  i ej@        e          ejA         ej?         ej@        e          ejA         ej@        e           ejE        eFeG           ej@        e/          ejA        iejD                  iiejD                  iejD                  ZHi ZIdedeJdeKfdZLdededeKfdZMdedefdZNdedefdZOdedefdZP	 d%deded eGfd!ZQd"eFd eGdeGfd#ZRdededeKfd$ZSdS )&    N)zeroconf)SOURCE_IMPORTConfigEntryConfigEntryState)
CONF_DEVICE_CLASSCONF_DEVICES	CONF_MODE	CONF_NAMECONF_PASSWORDCONF_PAYLOAD_OFFCONF_SENSORSCONF_TIMEOUTCONF_USERNAMEEVENT_HOMEASSISTANT_STOP)HomeAssistantServiceCall)ConfigEntryAuthFailedConfigEntryNotReady)config_validation)async_get_clientsession)	async_get)Store   )system_health)backwarddevices)
CONF_APPIDCONF_APPSECRETCONF_DEFAULT_CLASSCONF_DEVICEKEYCONF_RFBRIDGEDOMAIN)SIGNAL_ADD_ENTITIESSIGNAL_CONNECTED	XRegistry)XCameras)APP	AuthError)
binary_sensorbuttonclimatecoverfanlightremotesensorswitchnumberx   )default)extrahassconfigreturnc                    K   t           j        sdS i  j        t          <   t          |v r|t                   xt          _        }t          |v r+t          |v r"|t                   |t                   ft          d<   t          |v r,t          j        |                    t                               t          |v rAt          j        t          j        |                    t                              t          _        t!                      	 t"          t          j        t"                   t$          t          j        t$                   i} j                            t                    sC j        j                            t          dt.          i|          }                     |           n# t2          $ r Y nw xY wdt4          f fd} j                            t          d|           dS )	NFr   source)contextdatacallc                   K   t          | j                  }t          |                    d                    t	                    dk    rt          fd	j        t                                                   D                       }|j                 }|	                    d          x}r|
                    |           dS |                    dd          }|                    dd          }|                    ||||           d{V  dS t	                    dk    r$                    |d	                    d{V  dS t                              d
            dS )z|Service for send raw command to device.
        :param call: `device` - required param, all other params - optional
        device
   c              3   .   K   | ]}|j         v |V  d S Nr   ).0rdeviceids     ,/config/custom_components/sonoff/__init__.py	<genexpr>z4async_setup.<locals>.send_command.<locals>.<genexpr>   s8       ' 'QY9N9N9N9N9N9N' '    
set_deviceN
params_lancommand_lan   cmdzWrong deviceid )dictr=   strpoplennextr#   valuesr   getupdatesend_LOGGERerror)
r>   paramsregistryr@   vrK   rL   rF   camerasr7   s
          @rG   send_commandz!async_setup.<locals>.send_command   s      divzz(++,,x==B"& ' ' ' '9V,3355' ' ' # #H %h/F JJ|,,,q a   L$77J **]D99K--
KHHHHHHHHHHH]]a,,x77777777777 MM6H6677777rI   r^   T)r   hass_version_supportedr=   r#   r&   r8   r   r   r(   r    core_devicesset_default_classrQ   r   get_spec_wrapperget_specr'   r   r   config_entriesasync_entriesflow
async_initr   async_create_task	Exceptionr   servicesasync_register)r7   r8   confr=   coror^   r]   s   `     @rG   async_setuprn   a   s     * u DIf "(.0	4.D"8"8:&^(<=CF%%*4884F+G+GHHH4$0$A%txx'='=% %L!
 jjG 9+M:9+M:
 "0088 	)&+66= 9 7  D ""4(((   8 8 8 8 8 8 8 8: 	M  FFF4s   BF# #
F0/F0entryc                   K   | j         t                                       |j                  }|s8t	          |           }t          |          x| j         t                   |j        <   }|j                            d          r,t          j        s t          j
        | t                     d{V  |j                             t                    }|j                             t                    }|j                            t          d          }|j        t          j        k    r|dv sJ 	 |j                            ||           d{V  n@# t&          $ r3}t                              d| |           t+          |          d}~ww xY w|dk    r|j                                         n)|dk    r#|                     t1          | |                     dS |j        j        |r|r	 |j                            ||           d{V  n# t&          $ r}t                              d| |           |d	v r#|                     t5          | |                     |dv r3t7          |t8                    rt;          |          t+          |          |d
k    sJ Y d}~dS d}~ww xY w|                     t1          | |                     dS )a`  
    AUTO mode. If there is a login error to the cloud - it starts in LOCAL
    mode with devices list from cache. Trying to reconnect to the cloud.

    CLOUD mode. If there is a login error to the cloud - trying to reconnect to
    the cloud.

    LOCAL mode. If there is a login error to the cloud - it starts  with
    devices list from cache.
    debugNauto)rr   cloudzCan't login with mode: exc_infors   T)rr   localrv   )r=   r#   rU   entry_idr   r&   optionsrX   handlersr   setup_debugr   r   r	   stater   SETUP_RETRYrs   loginri   warningr   startrh   internal_normal_setupauthinternal_cache_setup
isinstancer)   r   )r7   ro   r[   sessionusernamepasswordmodees           rG   async_setup_entryr      s      y $$U^44H J)$//7@7I7II	&%.)H}!! 7'*: 7'g666666666z~~m,,Hz~~m,,H=Y//D {&222(((((	).&&x:::::::::: 	) 	) 	)OO<d<<qOIII%a(((	) 6>>N  """"W__""#8u#E#EFFFt~"x"H"	.&&x:::::::::: 		 		 		OO<d<<qOIII(((&&';D%'H'HIII(((a++ 3/222)!,,,7????44444		 	0u==>>>4s1   '!E	 	
F.FF%!H 
J!BJJ!c                 T   K   | j                             |j                   d {V  d S rC   )rd   async_reloadrw   )r7   ro   s     rG   async_update_optionsr      s7      


*
*5>
:
::::::::::rI   c                    K   | j                             |t                     d {V  | j        t                   |j                 }|                                 d {V  dS NT)rd   async_unload_platforms	PLATFORMSr=   r#   rw   stop)r7   ro   r[   s      rG   async_unload_entryr      si      


4
4UI
F
FFFFFFFF)F+EN;H
--//4rI   c                 D  K   d }	 | j         t                   |j                 }|j        j        r|j                            d          }|j                            |           d {V }t          	                    t          |           d           t          | dt           d|j         d          d          }|                    |           d {V  n3# t          $ r&}t                              d|           Y d }~nd }~ww xY wt          | ||           d {V  d S )	Nhomesz devices loaded from Cloudr   /r   .jsonzCan't load devicesrt   )r=   r#   rw   rs   r   rx   rU   get_devicesrX   rq   rR   r   
async_saveri   r~   r   )r7   ro   r   r[   r   storer   s          rG   r   r      sN     G:"i/?> 	,M%%g..E$N66u========GMMS\\EEEFFF$f#L#Luz*/E#L#L#LMME""7+++++++++ : : :,q99999999: tUG
4
4444444444s   CC 
D DDr   c                 d   K    j         t                   j                 }|j        rt	                      d {V  t          j         fdt          D               d {V  |mt           dt           dj         d          d          }|	                                 d {V }|r*t                              t          |           d           |r+t          j        |          }|                    |          }nd }j        s                    t"                                          j                            t*          |j                             j                            t2          d          }|dk    r%|j        j        r|j                                         |d	k    r2|j                            t=          j                    d {V            t                              |                                 d
z              |j        j!        r&|j        "                    tF                     d {V  n&|j        j        rt          j$        d           d {V  |rHt                              dt          |           d           |%                    tL          |           d S d S )Nc                 F    g | ]}j                             |          S  )rd   async_forward_entry_setup)rD   domainro   r7   s     rG   
<listcomp>z(internal_cache_setup.<locals>.<listcomp>  s<     

 

 

 99%HH

 

 

rI   r   r   r   r   z devices loaded from Cacherr   rv   rs   z mode start   zAdd z	 entities)'r=   r#   rw   onliner   asynciogatherr   r   
async_loadrX   rq   rR   internal_unique_devicessetup_devicesupdate_listenersadd_update_listenerr   async_on_unloadbusasync_listen_oncer   r   rx   rU   r	   rs   r   r   rv   r   async_get_instanceuppertaskdispatcher_waitr%   sleepdispatcher_sendr$   )r7   ro   r   r[   r   entitiesr   s   ``     rG   r   r      s      )F+EN;H  . u---------
.

 

 

 

 

#

 

 

        dA&HH5:j+AHHHII((******** 	GMMS\\EEEFFF )%.'BB))'22! 8!!"6777	""#;X]KK   =Y//Dw8>.w8#>t#D#DDDDDDDEEEMM$**,,./// ~  n,,-=>>>>>>>>>>		 mA  @5S]]555666  !4h?????@ @rI   uidc                        fd|D             S )zeFor support multiple integrations - bind each device to one integraion.
    To avoid duplicates.
    c                 ^    g | ])}t                               |d                    k    '|*S )rF   )UNIQUE_DEVICES
setdefault)rD   r@   r   s     rG   r   z+internal_unique_devices.<locals>.<listcomp>A  sC       $$VJ%7==DD 	DDDrI   r   )r   r   s   ` rG   r   r   =  s.          rI   c                 X   K   t          |                               |j                   dS r   )device_registryasync_remove_deviceid)r7   ro   r@   s      rG    async_remove_config_entry_devicer   H  s+       D--fi8884rI   rC   )Tr   logging
voluptuousvolhomeassistant.componentsr   homeassistant.config_entriesr   r   r   homeassistant.constr   r   r	   r
   r   r   r   r   r   r   homeassistant.corer   r   homeassistant.exceptionsr   r   homeassistant.helpersr   cv$homeassistant.helpers.aiohttp_clientr   %homeassistant.helpers.device_registryr   r   homeassistant.helpers.storager    r   corer   r   r`   
core.constr   r   r    r!   r"   r#   core.ewelinkr$   r%   r&   core.ewelink.camerar'   core.ewelink.cloudr(   r)   	getLogger__name__rX   r   SchemaOptionalstringensure_listpositive_intALLOW_EXTRAAnyrP   listCONFIG_SCHEMAr   rO   boolrn   r   r   r   r   r   r   r   r   rI   rG   <module>r      so         - - - - - - U U U U U U U U U U                        : 9 9 9 9 9 9 9 O O O O O O O O 9 9 9 9 9 9 H H H H H H N N N N N N / / / / / /             ) ) ) ) ) )                K J J J J J J J J J ) ) ) ) ) ) . . . . . . . .
'
H
%
%  	 


Z((")^,,bi]++RY]++RY/00")\**BN]++Izsz(CL33RY(CL):;;RY(CLsCCCR_(CL)9::BI	 "o     
. \**Izsz(CL33RY(CL):;;WSWS$=O=O(CL88")
 "o     	-%: /=
 
 
!D /G$ $ $L CM C4 CD C C C CL4- 4 4 4 4 4 4n;] ;; ; ; ; ;=     5m 5K 5 5 5 5( >B<@ <@
<@ +<@6:<@ <@ <@ <@~ t     
 +	     rI   