
    8iX                        S r SSKrSSKrSSKJr  SSKJrJrJr  SSK	J
r
  SSKJr  SSKJrJrJrJrJrJrJrJr  SSK	JrJrJr  SS	KJrJrJrJrJrJrJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)J*r*J+r+  SSK,r-SS
K.J/r/  SSK0J1r1  SSK2J3r3J4r4J5r5J6r6J7r7  SSK8J9r9  SSK:J;r;J<r<J=r=J>r>  SSK?J@r@JArA  \R                  " \C5      rDSrESrFSrGSrHSrISSSS.rJ0 S\_S\_S\_S\_S\_S\_S \_S!\_S"\_S#\"_S$\"_S%\#_S&\#_S'\"_S(\#_S)\_S*\!_0 S+\_S,\!_S-\_S.\_S/\ _S0\ _S1\_S2\_S3\ _S4\'_S5\'_S6\$_S7\$_S8\&_S9\&_S:\&_S;\%_E\&\(\(\(\*\*\*\)\*\+\+\+\+S<.ErK " S= S>\/R                  \>S?9rM " S@ SA\95      rN " SB SC\95      rO " SD SE\95      rPg)Fz"Config flow for Dyson integration.    N)Optional)DEVICE_TYPE_NAMES
get_deviceget_mqtt_info_from_wifi_info)DysonDeviceInfo)DysonDiscovery)DysonExceptionDysonFailedToParseWifiInfoDysonInvalidCredentialDysonInvalidAuthDysonNetworkErrorDysonOTPTooFrequentlyDysonInvalidAccountStatusDysonLoginFailure)DysonAccountDysonAccountCNREGIONS)DEVICE_TYPE_360_EYEDEVICE_TYPE_360_HEURISTDEVICE_TYPE_360_VIS_NAVDEVICE_TYPE_PURE_COOLDEVICE_TYPE_PURIFIER_COOL_EDEVICE_TYPE_PURIFIER_COOL_KDEVICE_TYPE_PURIFIER_COOL_MDEVICE_TYPE_PURE_COOL_DESKDEVICE_TYPE_PURE_COOL_LINKDEVICE_TYPE_PURE_COOL_LINK_DESKDEVICE_TYPE_PURE_HOT_COOLDEVICE_TYPE_PURIFIER_HOT_COOL_EDEVICE_TYPE_PURIFIER_HOT_COOL_KDEVICE_TYPE_PURE_HOT_COOL_LINKDEVICE_TYPE_PURE_HUMIDIFY_COOL$DEVICE_TYPE_PURIFIER_HUMIDIFY_COOL_E$DEVICE_TYPE_PURIFIER_HUMIDIFY_COOL_KDEVICE_TYPE_PURIFIER_BIG_QUIET)config_entries)async_get_instance)	CONF_HOST	CONF_NAME
CONF_EMAILCONF_PASSWORDCONF_USERNAME)HomeAssistantError   )CONF_CREDENTIALCONF_DEVICE_TYPECONF_SERIALDOMAIN)CONF_REGION	CONF_AUTH
   methodssidmobileotpz'Setup using your device's Wi-Fi stickerz-Setup automatically with your MyDyson AccountzSetup manually)wificloudmanualz360 Eye360EYEN223z360 Heurist
360HEURIST276z360 Vis Nav360VIS277TP02TP01DP01DP02475469TP04AM06438520TP07TP09TP11PC1438K438E438MHP02455HP04527HP07HP09527K527E)527MPH01PH02358PH03PH04358K358E358MBP02BP03BP04664c                   ~   \ rS rSrSrSr\R                  rS r	SS\
\   4S jjrSS\
\   4S jjrSS\
\   4S	 jjrSS\
\   4S
 jjrSS\
\   4S jjrSS\
\   4S jjrSS\
\   4S jjrSS\
\   4S jjrSS\
\   4S jjrS\4S jr SS\S\S\S\S\
\   S\
\   4S jjr SS\S\S\S\
\   SS4
S jjrSrg)DysonLocalConfigFlow   zDyson local config flow.r.   c                     SU l         g)zInitialize the config flow.N)_device_info)selfs    4/config/custom_components/dyson_local/config_flow.py__init__DysonLocalConfigFlow.__init__   s
         Ninfoc           	        #    Ubb  U[            S:X  a  U R                  5       I Sh  vN $ U[            S:X  a  U R                  5       I Sh  vN $ U R                  5       I Sh  vN $ U R	                  S[
        R                  " [
        R                  " [         5      [
        R                  " [        5      05      S9$  N Nt N^7f)z Handle step initialized by user.Nr:   r;   userstep_iddata_schema)
CONF_METHODasync_step_wifiasync_step_cloudasync_step_manualasync_show_formvolSchemaRequiredInSETUP_METHODS)rn   rs   s     ro   async_step_user$DysonLocalConfigFlow.async_step_user   s     K F*!11333K G+!22444//111##

CLL$=svvm?T#UV $ 
 	
 441s4   $CB>$CC C#C$AC CCc                   #    0 nUb   [        U[           U[           5      u  p4n[        U   n[        R                  S5        [        R                  SU5        [        R                  SU5        [        R                  SU5         U R                  UUUUUR                  [        5      5      I Sh  vN nU R                  UUS9$ U=(       d    0 nU R                  S[        R                   " [        R"                  " [        UR                  [        S5      S9[$        [        R"                  " [        UR                  [        S5      S9[$        [        R&                  " [        UR                  [        S5      S9[$        05      US9$  N! [         a    SUS'    N[         a    S	US'    N[         a    S
US'    Nf = f! [         a	    SUS'    GNf = f7f)z5Handle step to set up using device Wi-Fi information.Nz#Successfully parse WiFi informationz
Serial: %szDevice Type: %szDevice Type Name: %stitledatainvalid_authbasecannot_connectcannot_findcannot_parse_wifi_infor:    defaultrw   rx   errors)r   	CONF_SSIDr+   r   _LOGGERdebug_async_get_entry_datagetr(   async_create_entryInvalidAuthCannotConnect
CannotFindr
   r}   r~   r   r   strr   )rn   rs   r   serial
credentialdevice_typedevice_type_namer   s           ro   rz   $DysonLocalConfigFlow.async_step_wifi   s    2NOT-%83/K $5[#A CDlF3/=46FG!%!;!;"#(+" D  22.! 3  
 zr##

LLDHHY4KLcLL%txxr/JLLDHHY4KLc  $ 
 	
) # 4%3F6N$ 6%5F6N! 3%2F6N3) . :!9v:sw   GG A G+F 2F
3F 7CG
F F>GF>+G-F>;G=F>>GGGGGc           	        #    UbN  U[            U l        U R                  S:X  a  U R                  5       I S h  vN $ U R                  5       I S h  vN $ [        R
                  " 5        VVs0 s H  u  p#X# SU S3_M     nnnU R                  S[        R                  " [        R                  " [         5      [        R                  " U5      05      S9$  N Ns  snnf 7f)NCN ()r;   rv   )r3   _regionasync_step_mobileasync_step_emailr   itemsr}   r~   r   r   r   )rn   rs   codenameregion_namess        ro   r{   %DysonLocalConfigFlow.async_step_cloud   s     ,DL||t#!33555..000 &mmo
-
 F"TF!$$- 	 
 ##

[)366,+?$  $ 
 	
 60
s4   5CCCCC,C ACCCc                   #    0 nUb  U[            nSU 3nU R                  5        H$  nUR                  U:X  d  M  U R                  SS9s  $    U R	                  U5      I S h  vN   U R                  5         [        5       n U R                  R                  UR                  X0R                  5      I S h  vN U l        X0l        U R                  5       I S h  vN $ U=(       d    0 nU R#                  S[$        R&                  " [$        R(                  " [         UR+                  [         S	5      S
9[,        05      US9$  N N Ni! [         a    SUS'    Nx[         a    SUS'    N[          a    SUS'    Nf = f7f)Nglobal_already_configuredreasoncannot_connect_cloudr   email_not_registeredr   emailr   r   r   )r*   _async_current_entries	unique_idasync_abortasync_set_unique_id_abort_if_unique_id_configuredr   hassasync_add_executor_joblogin_email_otpr   _verify_emailasync_step_email_otpr   r   r   r}   r~   r   r   r   r   )rn   rs   r   r   r   entryaccounts          ro   r   %DysonLocalConfigFlow.async_step_email   sj    $E!%)I446??i/++3G+HH 7 **9555//1"nG9%)YY%E%E++ULL&   $!66888zr##

Z*b1IJC$   $ 
 	
' 6
  9 % 8!7v, 8!7v# 0!/v0sw   5E9'E9"D>#E93E 5E 6	E ?E9EA&E9 E E9E6E9E6#E9%E63E95E66E9c           
        #    0 nUb   U R                   R                  U R                  U[           U[           5      I S h  vN nU R                  SU R                   SU R                   S3[        U R                  [        U0S9$ U R                  S[        R                  " [        R                  " [        5      [        [        R                  " [        5      [        05      US9$  N! [         a    SUS'    Ntf = f7f)	N	MyDyson: r   r   r   r   r   	email_otpr   )r   r   r   CONF_OTPr+   r   r   r   r3   r4   r   r}   r~   r   r   r   rn   rs   r   	auth_infos       ro   r   )DysonLocalConfigFlow.async_step_email_otp  s     "&))"B"BLL$x.$}2E# 	 ..%dkk]"T\\N!D#T\\!9 /   ##

]+SX&$   $ 
 	
 % 0!/v0s;   C?8C* C(C* B"C?(C* *C<9C?;C<<C?c                   #    0 nUb  [        5       nU[           nUR                  S5      (       d  SU 3n U R                  R	                  UR
                  U5      I S h  vN U l        X@l        U R                  5       I S h  vN $ U=(       d    0 nU R                  S[        R                  " [        R                  " [        UR                  [        S5      S9[        05      US9$  N Ng! [         a    SUS'    Nvf = f7f)	N+z+86otp_too_frequentr   r8   r   r   r   )r   CONF_MOBILE
startswithr   r   login_mobile_otpr   _mobileasync_step_mobile_otpr   r}   r~   r   r   r   r   )rn   rs   r   r   r8   s        ro   r   &DysonLocalConfigFlow.async_step_mobile3  s     $&G+&F$$S))vh:%)YY%E%E,,f&    &!77999zr##

[$((;2KLc$   $ 
 	
  :	 ) 4!3v4sM   4D)C-  C)!	C- *DC+A%D)C- +D-C?<D>C??Dc                   #    0 nUbw   U R                   R                  U R                  U[           5      I S h  vN nU R	                  SU R
                   SU R                   S3[        U R                  [        U0S9$ U R                  S[        R                  " [        R                  " [        5      [        05      US9$  N! [         a    SUS'    NVf = f7f)	Nr   r   r   r   invalid_otpr   
mobile_otpr   )r   r   r   r   r   r   r   r3   r4   r   r}   r~   r   r   r   r   s       ro   r   *DysonLocalConfigFlow.async_step_mobile_otpM  s     "&))"B"BLL$x.# 	 ..%dll^2dll^1E#T\\!9 /   ## 

X&$   $ 
 	
 % /!.v/s8   C0C CC BCC CCCCc                 (  #    0 nUb  U[            nU R                  5        H$  nUR                  U:X  d  M  U R                  SS9s  $    U R	                  U5      I Sh  vN   U R                  5         U[           n[        U   n U R                  UU[           UUUR                  [        5      5      I Sh  vN nU R                  UUS9$ U=(       d    0 nU R!                  S	["        R$                  " ["        R&                  " [         UR                  [         S
5      S9[(        ["        R&                  " [        UR                  [        S
5      S9[(        ["        R&                  " [        UR                  [        S
5      S9["        R*                  " [        5      ["        R,                  " [        UR                  [        S
5      S9[(        05      US9$  GNw GN ! [         a	    SUS'    GN [         a	    SUS'    GN1[         a	    SUS'    GNBf = f7f)zHandle step to setup manually.Nr   r   r   r   r   r   r   r<   r   r   r   )r1   r   r   r   r   r   r0   r   r   r/   r   r(   r   r   r   r   r}   r~   r   r   r   r   r   )rn   rs   r   r   r   r   r   r   s           ro   r|   &DysonLocalConfigFlow.async_step_manualh  s    +&F446??f,++3G+HH 7 **6222//1/0K0=!77)$HHY'  ..* /  
 zr##

LLdhh{B6OPRULL'/21NLL($((;KR2Pvv/0LLDHHY4KLc	  $ 
 	
5 3  0!/v  2!1v /!.v/se   0H'HG&H2G 7G8G <DHG H)H,H:H=HHHHc                 2  #    0 nUGb  U R                   R                  5       n[        R                  SU R                   R                  [        U R                   SS5      U5        [        R                  S[        U R                   S5      5        [        U R                   S5      (       a*  [        R                  SU R                   R                  5        UcF  [        R                  SU R                   R                  [        U R                   SS5      5        SUS'   O U R                  U R                   R                  U R                   R                  UUR                  [        5      UR                  [        5      5      I Sh  vN nU R                  UR                  [        5      US	9$ U R                   R$                  =(       d    U R                   R                  nU=(       d    0 nU R'                  S[(        R*                  " [(        R,                  " [        UR                  [        S5      S9[.        [(        R,                  " [        UR                  [        U5      S9[.        05      US9$  N! [          a    S
US'    N["         a    SUS'    Nf = f7f)zHandle step to set host.Nz1Cloud ProductType: %s, variant: %s, Mapped to: %svariantz,Device info object has variant attribute: %szRaw variant value: %rz4Unknown device type for ProductType: %s, variant: %sunknown_device_typer   r   r   r   hostr   r   r   )rm   get_device_typer   r   product_typegetattrhasattrr   errorr   r   r   r   r)   r(   r   r   r   r   r}   r~   r   r   r   )rn   rs   r   r   r   r   s         ro   async_step_host$DysonLocalConfigFlow.async_step_host  s&    ++;;=KMMM**77ARART]_c9dfqsMMH'RVRcRcenJopt(()445t7H7H7P7PQ"T!..;;WTEVEVXacg=hj!6v!%!;!;))00))44#++" D  22"hhy1! 3     %%A):):)A)Azr##

LLDHHY4KLcLLDHHY4MNPS  $ 	
 		
- % 6%5F6N! 3%2F6N3sJ   DJA&I2 I0I2 C(J0I2 2JJJJJJc                 l  #    [         R                  SUR                  UR                  5        U R	                  5        HN  nUR
                  UR                  :X  d  M  [         R                  SUR                  5        U R                  SS9s  $    U R                  UR                  5      I Sh  vN   U R                  5         [        UR                  [        UR                  0U R                  S'   Xl        [         R                  SUR                  5        U R                  5       I Sh  vN $  N N7f)z-Handle step initialized by MyDyson discovery.z8Starting discovery step for device: %s (ProductType: %s)z&Device %s already configured, abortingr   r   Ntitle_placeholdersz8Device %s passed initial checks, proceeding to host step)r   r   r   r   r   r   r   r   r   r   r)   r1   contextrm   r   )rn   rs   r   s      ro   async_step_discovery)DysonLocalConfigFlow.async_step_discovery  s     PYY 1 1	3 002E$++-FT''/C'DD 3
 &&t{{333++-tyy.
)* !PRVR]R]^))+++ 	4 ,s,   AD4AD4.D0/A<D4+D2,D42D4r   r   r   r   r   returnc           
         #    U R                  XX55      I Sh  vN   [        U[        U[        U[        U[
        U0$  N$7f)z)Try connect and return config entry data.N)_async_try_connectr1   r/   r0   r)   r(   )rn   r   r   r   r   r   s         ro   r   *DysonLocalConfigFlow._async_get_entry_data  sF      %%f+LLLZktt
 	
 	Ms   ?=%?c           
        ^^#    [         R                  SXT5        [        XU5      nUc  [         R                  SX5        [        e[         R                  S[        U5      R                  5        T(       Gd  [         R                  SU5        [        R                  " 5       mS[        SS4UU4S jjn[        5       nUR                  XV5        US	:X  a  S
OSn[         R                  SX85        UR                  [        U R                  5      I Sh  vN 5        U R                  R                  TR                   ["        5      I Sh  vN n	UR%                  5         U	(       d  [         R                  SXU5        [&        e[         R                  ST5        [         R                  ST5         UR)                  T5        [         R                  S5        g N N! [*         a    [         R                  SU5        [,        e[.         a  n
[         R                  SXT[        U
5      R                  U
5        S[        U
5      ;   d  S[        U
5      ;   a  [         R                  S5        [         R                  SU5        [         R                  S5        [         R                  S5        [         R                  S5        [         R                  S5        [        eSn
A
ff = f7f)zTry connect.zCAttempting to connect to device: serial=%s, device_type=%s, host=%sNz{Failed to create device object for serial=%s, device_type=%s. This usually indicates an unknown or unsupported device type.z.Successfully created device object of type: %sz:No host provided, starting device discovery for serial: %saddressr   c                 V   > [         R                  SU 5        U mTR                  5         g )NzFound device at %s)r   r   set)r   
discoveredr   s    ro   	_callback:DysonLocalConfigFlow._async_try_connect.<locals>._callback  s!    2G< rr   r>   z_360eye_mqtt._tcp.local.z_dyson_mqtt._tcp.local.zAStarting discovery for device_type=%s, expecting service type: %szSDiscovery timed out for device serial=%s, device_type=%s. Expected service type: %sz)Discovery successful, device found at: %sz*Attempting MQTT connection to device at %sz)Successfully connected to device via MQTTz(Invalid credentials for device serial=%szGFailed to connect to device serial=%s, device_type=%s, host=%s: %s (%s)zConnection refusedzresult code 7z<MQTT connection refused (result code 7) - this may indicate:z-  1. Wrong device type mapping (expected: %s)z.  2. Device firmware issue or unexpected statez&  3. MQTT broker unavailable on devicez"  4. Network connectivity problemsz,  5. Device already has too many connections)r   r   r   r   r   type__name__	threadingEventr   r   register_devicestart_discoveryr'   r   r   waitDISCOVERY_TIMEOUTstop_discoveryr   connectr   r   r	   )rn   r   r   r   r   devicer   	discoveryexpected_service_typesucceederrr   s       `      @ro   r   'DysonLocalConfigFlow._async_try_connect  sX     	[$	0 F< >MM Y.  FVH]H]^ MMVX^_"*J!3 !4 ! ! '(I%%f8 CNQWBW$>]v!MM]$= %%,>tyy,I&IJ II<<!2 G $$& 9:@Odf  MMEtL 	BDI	 NN4 MMEF! 'J  & 	MMDfM 	 MMcdDI4F4FM $s3x/?c#h3N\]M{[NOFGBCLM	 sJ   DKG5KG	A$K.&G KK/KCKKK)rm   r   r   r   r   )N)r   
__module____qualname____firstlineno____doc__VERSIONr&   CONN_CLASS_LOCAL_PUSHCONNECTION_CLASSrp   r   dictr   rz   r{   r   r   r   r   r|   r   r   r   r   r   r   __static_attributes__ rr   ro   rj   rj      sQ   "G%;;!
(4. 
1
(4. 1
f
8D> 
$!
8D> !
F
x~ 
6
HTN 
4
 
61
HTN 1
f1
(4. 1
f, ,4 #

 
 	

 
 sm
 
#
. #J J  J  	J 
 smJ  
J  J rr   rj   )domainc                       \ rS rSrSrSrg)r   iA  zRepresents connection failure.r  Nr   r  r  r  r  r  r  rr   ro   r   r   A  s    (rr   r   c                       \ rS rSrSrSrg)r   iE  zRepresents discovery failure.r  Nr  r  rr   ro   r   r   E  s    'rr   r   c                       \ rS rSrSrSrg)r   iI  z"Represents invalid authentication.r  Nr  r  rr   ro   r   r   I  s    ,rr   r   )Qr  loggingr   typingr   libdysonr   r   r   libdyson.cloudr   libdyson.discoveryr   libdyson.exceptionsr	   r
   r   r   r   r   r   r   r   r   r   libdyson.constr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   
voluptuousr~   homeassistantr&   !homeassistant.components.zeroconfr'   homeassistant.constr(   r)   r*   r+   r,   homeassistant.exceptionsr-   constr/   r0   r1   r2   cloud.constr3   r4   	getLoggerr   r   r   ry   r   r   r   r   !CLOUD_PRODUCT_TYPE_TO_DEVICE_TYPE
ConfigFlowrj   r   r   r   r  rr   ro   <module>r%     s   (    P P * -	 	 	 A @    *  ( @ ^ ^ 7 I I /


H
% 	 6<J%"J% !J% 	J% *J% )J% 
"J% *J% %J% 
"J%" &#J%$ &%J%& +'J%( +)J%* 
%+J%, 
*-J%2 !3J%4 &5J%6 
 7J%8 
%9J%> '?J%@ 'AJ%B 'CJ%D 
&EJ%H 'IJ%J 'KJ%L 'MJ%R *SJ%T 
)UJ%Z %[J%\ 
$]J%b +cJ%d +eJ%h +iJ%j +kJ%l , +*) 10000 +**)SJ% !`f >44V f R)& )(# (-$ -rr   