
    &i+                         S SK r S SKrS SKJr  S SKrS SKrS SKJr  S SKJ	r	J
r
JrJr  \R                  " \5      rSrSrSrSrS	rS
rSr " S S5      r " S S\5      r " S S\5      r " S S\5      rg)    N)	urlencode)HomeAssistantError)AdvancedSettingsKeyAtTypeDeviceControlKeyModeAndSettingKeysz/api/user/appUserLoginz/api/user/devInfoListAllz/api/dev/getdevModeSettingListz/api/dev/addDevModez/api/dev/modeAndSettingz/api/dev/getDevSettingz/api/dev/updateAdvSettingc            
       J   \ rS rSrSrS\S\S\SS4S jrS	 rS
 rS r	S\\
-  S\
4S jr\S\\   S\S\4S j5       rS\\
-  S\
S\\\
4   4S jrS\\
-  S\
S\S\\\
4   4S jrS\\
-  S\
S\\\
4   4S jrS S jrS\R*                  4S jrS rS rS!S\S\S\4S jjrSrg)"ACInfinityClient   z.Encapsulates http calls to the AC Infinity APIhostemailpasswordreturnNc                 D    Xl         X l        X0l        SU l        SU l        g)z
Args:
    host: The base host of the AC Infinity API
    email: The e-mail to log in as, as configured by the user via config_flow
    password: The password to log in with, as configured by the user via config_flow
N)_host_email	_password_user_id_session)selfr   r   r   s       //config/custom_components/ac_infinity/client.py__init__ACInfinityClient.__init__   s!     
!$(6:    c                    #    U R                  SS9nU R                  SS nU R                  [        U R                  US.U5      I Sh  vN nUS   S   U l        g N7f)	zsCall the log in endpoint with the configured email and password, and obtain the user id to use for subsequent callsFuse_auth_tokenr      )appEmailappPasswordlNdataappId)!_ACInfinityClient__create_headersr   _ACInfinityClient__postAPI_URL_LOGINr   r   )r   headersnormalized_passwordresponses       r   loginACInfinityClient.login&   si     ''u'= $(>>!B#76IJ
 

 !(1
s   AAA	Ac                 ,    U R                   (       a  S$ S$ )z3returns true if the user id is set, false otherwiseTFr   r   s    r   is_logged_inACInfinityClient.is_logged_in5   s    }}t/%/r   c                    #    U R                  5       (       d  [        S5      eU R                  SS9nU R                  [        SU R
                  0U5      I Sh  vN nUS   $  N	7f)z|Obtains a list of controllers, including metadata and some sensor values.
Does not include information related to settings.
$AC Infinity client is not logged in.Tr   userIdNr!   )r.   ACInfinityClientCannotConnectr#   r$    API_URL_GET_DEVICE_INFO_LIST_ALLr   )r   r&   bodys      r   get_account_controllers(ACInfinityClient.get_account_controllers9   si        ""/0VWW''t'<[[,x.G
 
 F|
s   AA$A"
A$controller_iddevice_portc                    #    U R                  5       (       d  [        S5      eU R                  SS9nU R                  [        XS.U5      I Sh  vN nUS   $  N	7f)a  Obtains the settings for a particular port on a controller, which includes information
like speed, sensor triggers, mode timers, etc...

Args:
    controller_id: The parent controller id of the port
    device_port: The port on the controller of the settings list to grab
r1   Tr   devIdportNr!   )r.   r3   r#   r$   API_URL_GET_DEV_MODE_SETTING)r   r8   r9   r&   r5   s        r   get_device_mode_settings)ACInfinityClient.get_device_mode_settingsF   sd        ""/0VWW''t'<[[(M*WY`
 
 F|
s   AAA
Adevice_control_keys
new_valuesexisting_valuesc                 F   0 nU  H  nUR                  XBR                  US5      5      nUc  SX4'   M-  [        U[        [        45      (       a  [        R
                  " U5      X4'   Mb  [        U[        5      (       a  [        U5      R                  5       X4'   M  XSU'   M     U$ )Nr   )	get
isinstancedictlistjsondumpsboolstrlower)rA   rB   rC   updatedkeyvalues         r   __transfer_values"ACInfinityClient.__transfer_valuesW   s    /1&CNN3(;(;C(CDE} ED$<00#zz%0E4(("5z//1$ ' r   
key_valuesc                   #    U R                  5       (       d  [        S5      eU R                  SS9nU R                  [        XS.U5      I Sh  vN nUS   n[        [        5       Vs/ s H+  nUR                  S5      (       a  M  [        [        U5      PM-     nnU R                  XU5      n	U R                  [         S[        U	5       3SU5      I Sh  vN n
g Ns  snf  N7f)	zSets the provided settings on a port to a new values

Args:
    controller_id: The parent controller id
    device_port: The port on the controller the device is plugged into
    key_values: The key value pairs of settings to set
r1   Tr   r;   Nr!   _?)r.   r3   r#   r$   r>   dirr   
startswithgetattr"_ACInfinityClient__transfer_valuesAPI_URL_ADD_DEV_MODEr   )r   r8   r9   rS   r&   r5   rC   attrrA   rN   rU   s              r   update_device_controls'ACInfinityClient.update_device_controlsg   s        ""/0VWW''t'<[[(M*WY`
 
 v, ,-*
-??3' ,G$d+- 	 *
 (()</Z++!5 6a	'8J7KLdT[\\

*
 ]s6   AC&CC&)CC<C&C$C&C&device_namec                   #    U R                  5       (       d  [        S5      eU R                  SS9nU R                  [        XS.U5      I Sh  vN nUS   n[        [        5       Vs/ s H+  nUR                  S5      (       a  M  [        [        U5      PM-     n	nU R                  XU5      n
X:[        R                  '   U R                  [         S[        U
5       3SU5      I Sh  vN ng Ns  snf  N7f)	a  Sets the provided settings on a port to a new values

Args:
    controller_id: The parent controller id
    device_port: The port on the controller the device is plugged into
    device_name: The name of the device
    key_values: The key value pairs of settings to set
r1   Tr   r;   Nr!   rU   rV   )r.   r3   r#   r$   API_URL_GET_DEV_SETTINGrW   r   rX   rY   rZ   DEV_NAMEAPI_URL_UPDATE_ADV_SETTINGr   )r   r8   r9   r_   rS   r&   r5   rC   r\   device_settings_keysrN   rU   s               r   update_device_settings'ACInfinityClient.update_device_settings   s        ""/0VWW''t'<[[#}%RT[
 
 v, /0+
0??3' /G'.0 	 +
 (()=?[0;#,,-++!; <Ai>P=QRTXZabb

+
 cs7   AC8C/C8)C1C1AC8)C6*C81C8c                   #    U R                  5       (       d  [        S5      eU R                  SSS9nU R                  [        XS.U5      I Sh  vN nUS   nU[
        R                     R                  5       nUR                  U5        [        [        5       Vs/ s H+  nUR                  S5      (       a  M  [        [        U5      PM-     n	nU R                  XU5      n
U
[
        R                     nU=[        R                   :X  a    SU
[        R"                  '   GO=[        R$                  :X  a    S	U
[        R"                  '   O=[        R&                  :X  a    S
U
[        R"                  '   O==[        R(                  :X  a  O=[        R*                  :X  a  O  O    SU
[        R"                  '   Oy==[        R,                  :X  a  O=[        R.                  :X  a  O  O    SU
[        R"                  '   O6[        R0                  :X  a  SU
[        R"                  '   O [3        SU 35      e[4         S[7        U
5       3nU R9                  X5      I Sh  vN ng GNs  snf  N7f)zSets the provided settings on a port to a new values

Args:
    controller_id: id of the controller
    device_port: port of the device
    key_values: The key value pairs of settings to set
r1   T)r   use_min_versionr;   Nr!   rU   z[16,17]z[16,18]z[112,16,19,32,98,99]z
[16,20,21]z[16,22,23,40]z[16,81,32,98,99]z2Unable to find setting id string - Unknown atType rV   )r.   r3   r#   r$   r>   r   DEV_SETTINGcopyupdaterW   r   rX   rY   rZ   AT_TYPEr   OFFMODE_AND_SETTING_ID_STRONAUTOTIMER_TO_ONTIMER_TO_OFFCYCLESCHEDULEVPD
ValueErrorAPI_URL_MODE_AND_SETTINGSr   _ACInfinityClient__put)r   r8   r9   rS   r&   r5   rC   	flattenedr\   rA   rN   at_typeurlrU   s                 r   %update_ai_device_control_and_settings6ACInfinityClient.update_ai_device_control_and_settings   s       ""/0VWW''tT'R[[(M*WY`
 
 v,#$4$@$@AFFH	) ./*
/??3' .G&-/ 	 *
 (()<)T*223FO*BBCFO*BBCF\*BBC9###&9f&9&99FR*BBC//FU*BBCFX*BBC #UV]U^!_``*+1Yw-?,@A**S**E
*
4 +s8   AI&IAI&I:IFI&I$I&I&c                    #    U R                   (       a=  U R                   R                  (       d"  U R                   R                  5       I Sh  vN   SU l         g N7f)zClose the session when doneN)r   closedcloser-   s    r   r   ACInfinityClient.close   s:     ==!5!5--%%''' (s   A
AAAc                    #    U R                   b  U R                   R                  (       a  [        R                  " SS9U l         U R                   $ 7f)zGet or create the HTTP sessionF)raise_for_status)r   r   aiohttpClientSessionr-   s    r   __get_sessionACInfinityClient.__get_session   s7     == DMM$8$8#115IDM}}s   AAc                 V  #    U R                  5       I Sh  vN n[        R                  " S5       ISh  vN   UR                  U R                   U 3X#S9 ISh  vN nUR
                  S:w  a  [        eUR                  5       I Sh  vN nUS   S:w  a  U[        :X  a  [        e[        U5      eUsSSS5      ISh  vN   sSSS5      ISh  vN   $  N N N~ NR N N! , ISh  vN  (       d  f       O= fSSS5      ISh  vN    g! , ISh  vN  (       d  f       g= f7f)z6generically make a post request to the AC Infinity APIN
   )r!   r&      code)_ACInfinityClient__get_sessionasync_timeouttimeoutpostr   statusr3   rI   r%   ACInfinityClientInvalidAuthACInfinityClientRequestFailed)r   path	post_datar&   sessionr(   r5   s          r   __postACInfinityClient.__post   s     **,, ((,,gllzzl4&!	 /; /
 /
#%33!(DF|s"=(557==/
 /
 /
,,, -, /
 )/
, /
 /
 /
,,,,,,s   D)CD)CD)#DCD *C#
C)C#4D CDD)C!D)D)DC#D!D)#C:	)C,*C:	6D=D)D	D)D&DD&"D)c                 6  #    U R                  5       I Sh  vN n[        R                  " S5       ISh  vN   UR                  U R                   U 3US9 ISh  vN nUR
                  S:w  a  [        eUR                  5       I Sh  vN nUS   S:w  a  [        U5      eUsSSS5      ISh  vN   sSSS5      ISh  vN   $  N N Nn NB N N! , ISh  vN  (       d  f       O= fSSS5      ISh  vN    g! , ISh  vN  (       d  f       g= f7f)z5generically make a put request to the AC Infinity APINr   )r&   r   r   )	r   r   r   putr   r   r3   rI   r   )r   r   r&   r   r(   r5   s         r   __putACInfinityClient.__put   s     **,, ((,,gkkzzl4&!7 /: /
 /
#%33!(DF|s"3D99/
 /
 /
,,, -, /
 )/
, /
 /
 /
,,,,,,s   DCDC	D#C?CC? *C
CC$C?0C1C?5DCD	DC?CC?DC*	CC*	&C?-D8C;9D?DDDDr   rh   c                 R    SS0nU(       a  U R                   US'   U(       a  SUS'   U$ )zBCreates a header object to use in a request to the AC Infinity APIz
User-Agentzokhttp/4.12.0tokenz3.5
minversionr,   )r   r   rh   r&   s       r   __create_headers!ACInfinityClient.__create_headers  s5     /
 #}}GG$)GL!r   )r   r   r   r   r   )r   N)F)__name__
__module____qualname____firstlineno____doc__rL   r   r)   r.   r6   intr?   staticmethodrH   rG   rZ   r]   re   r|   r   r   r   r   r$   rx   rK   r#   __static_attributes__ r   r   r
   r
      sO   8;S ; ; ; ;20C#I TW " tCy d ]a  ] 3Y]58]FJ3PS8n]8c 3Yc58cGJcX\]`be]eXfc>0+ 3Y0+580+FJ3PS8n0+dW%:%: $t d W[  r   r
   c                       \ rS rSrSrSrg)r3   i  z$Error to indicate we cannot connect.r   Nr   r   r   r   r   r   r   r   r   r3   r3     s    .r   r3   c                       \ rS rSrSrSrg)r   i  z(Error to indicate there is invalid auth.r   Nr   r   r   r   r   r     s    2r   r   c                       \ rS rSrSrSrg)r   i  z"Error to indicate a request failedr   Nr   r   r   r   r   r     s    ,r   r   )rI   loggingurllib.parser   r   r   homeassistant.exceptionsr   #custom_components.ac_infinity.constr   r   r   r   	getLoggerr   _LOGGERr%   r4   r>   r[   rw   ra   rc   r
   r3   r   r   r   r   r   <module>r      s      "   7 q q


H
%(#=  ? , 5 2 8 x xv/$6 /3"4 3-$6 -r   