
    iG                       S r SSKJr  SSKrSSKrSSKrSSKJr  SSKJ	r	  SSK
Jr  SSKJs  Jr  SSKrSSKJrJrJrJrJrJrJrJrJr  SSKJr  SS	KJrJ r J!r!J"r"  SS
K#J$r%  SSK&J'r(  SSK)J*r*  SSK+J,r,J-r-J.r.  SSK/J0r0J1r1  SSK2J3r3  SSK4J5r6  SSK7J8r8  SSK9J:r:J;r;  SSK<J=r=J>r>J?r?  SSK@JArA  SSKBJCrC  SSKDJErE  SSKFJGrH  SSKIJJrJ  SSKKJLrL  SSKMJNrNJOrOJPrPJQrQJRrRJSrSJTrTJUrUJVrVJWrWJXrXJYrYJZrZJ[r[J\r\J]r]J^r^J_r_J`r`JaraJbrbJcrcJdrdJereJfrfJgrgJhrh  SSKiJjrjJkrkJlrl  \R\_\h\`\\c\P\]\f\d\L\e\\b\\a0rm\\R/\\h/\L\L/\\/\\/\\/\\\P/\\R/\\/0	rnSro\R                  " \R                  " \,5      \R                  05      rs\R                  " \R                  " \g5      \t05      ruSrvSrw\R                  " \y5      rz\	" SS 9r{S(S! jr|S)S" jr}S)S# jr~S)S$ jrS*S% jr " S& S'5      rg)+z1Platform to control a Bosch IP thermostats units.    )annotationsN)	Awaitable)	timedelta)Any)	DHWHCHTTPNUMBER	RECORDINGSCSELECTSENSORZN)DV)DeviceExceptionEncryptionExceptionFirmwareExceptionUnknownDevice)__version__)async_create)ConfigEntry)ATTR_ENTITY_IDCONF_ADDRESSEVENT_HOMEASSISTANT_STOP)HomeAssistantcallback)ConfigEntryNotReady)device_registry)async_get_clientsession)async_dispatcher_connectasync_dispatcher_send)async_call_laterasync_track_point_in_utc_timeasync_track_time_interval)	save_json)get_url)
ConfigType)dt)	load_json)SWITCH   )
ACCESS_KEYACCESS_TOKENBINARY_SENSORBOSCH_GATEWAY_ENTRYCLIMATECONF_DEVICE_TYPECONF_PROTOCOLDOMAINFIRMWARE_SCAN_INTERVALFW_INTERVALGATEWAYINTERVALNOTIFICATION_IDRECORDING_INTERVALSCAN_INTERVAL!SIGNAL_BINARY_SENSOR_UPDATE_BOSCHSIGNAL_BOSCHSIGNAL_CLIMATE_UPDATE_BOSCHSIGNAL_DHW_UPDATE_BOSCHSIGNAL_NUMBERSIGNAL_SELECTSIGNAL_SENSOR_UPDATE_BOSCHSIGNAL_SOLAR_UPDATE_BOSCHSIGNAL_SWITCHSOLARUUIDWATER_HEATER)async_register_debug_serviceasync_register_servicesasync_remove_serviceszcustom_bosch_db.jsontaskbosch_configs)hoursc                2   #    0 U R                   [        '   g7f)zInitialize the Bosch platform.T)datar3   )hassconfigs     +/config/custom_components/bosch/__init__.pyasync_setuprR      s     DIIfs   c                  #    [         R                  S[         S35        UR                  [           nUR                  UR                  [        5      5        [        U UUR                  [           UR                  [           UR                  [           UR                  [           UR                  [           US9n[        U0U R                  [           U'   UR!                  5       I Sh  vN nU(       d  U$ [#        X5        g N7f)z)Create entry for Bosch thermostat device.z#Setting up Bosch component version .)rO   uuidhostprotocoldevice_type
access_keyaccess_tokenentryNT)_LOGGERinfo
LIBVERSIONrN   rE   async_on_unloadadd_update_listenerasync_update_optionsBoschGatewayEntryr   r2   r1   r,   r-   r/   r3   
async_initrH   )rO   r[   rU   gateway_entry_init_statuss        rQ   async_setup_entryrf      s     LL6zl!DE::dD	%334HIJ%ZZ%M*JJ/0::j)ZZ-	M  3MBDIIfd,7799LD(	 :s   C)D+D,Dc                |  ^#    [         R                  S5        UR                  [           nU R                  [           U   mU4S jnU" [
        5        U" [        5        U" [        5        U R                  [           R                  U5      nU[           R                  5       I Sh  vN n[        X5        U$  N7f)zUnload a config entry.zRemoving entry.c                H   > TR                  U S 5      nU(       a  U" 5         g g N)pop)keyvaluerN   s     rQ   remove_entry(async_unload_entry.<locals>.remove_entry   s     d#G     N)r\   debugrN   rE   r3   r7   r5   r9   rj   r/   async_resetrI   )rO   r[   rU   rm   bosch	unload_okrN   s         @rQ   async_unload_entryrt      s     MM#$::dD99VT"D
 #$IIf!!$'E/0<<>>I$& ?s   B%B<(B:)B<c                   #    [         R                  SUR                  5        U R                  R	                  UR                  5      I Sh  vN   g N7f)zReload entry if options change.zReloading entry %sN)r\   rp   entry_idconfig_entriesasync_reloadrO   r[   s     rQ   ra   ra      s6     MM&7



*
*5>>
:::s   A	AAAc                ,    [        U SSU S3[        S9  g)z/Create notification about firmware to the user.z
Bosch infoz3There are problems with config of your thermostat.
z.
You can create issue on Github, but first
Go to [Developer Tools/Service](/developer-tools/service) and create bosch.debug_scan.
[BoschGithub](https://github.com/bosch-thermostat/home-assistant-bosch-custom-component)titlemessagenotification_idN)$async_create_persistent_notificationr8   rO   msgs     rQ   create_notification_firmwarer      s)    (Be gg (ro   c                      \ rS rSrSr  SS jr\SS j5       rSS jr\	SS j5       r
SS jrSSS	 jjrSS
 jrSS jrSS jrSS jrSS jrSS jrSS jrSrg)rb      z!Bosch gateway entry config class.c	                    Xl         X l        X0l        X`l        Xpl        XPl        X@l        Xl        SU l        SU l	        SU l
        SU l        SU l        / U l        SU l        g)z&Init Bosch gateway entry config class.FN)rO   rU   _host_access_key_access_token_device_type	_protocolconfig_entry_debug_service_registeredgatewayprefs_initial_update_signal_registeredsupported_platforms_update_lock)	selfrO   rU   rV   rW   rX   rY   rZ   r[   s	            rQ   __init__BoschGatewayEntry.__init__   sf     		
%)'!!).&
$"'#%  ro   c                .    U R                   R                  $ ri   )r   rv   r   s    rQ   	device_idBoschGatewayEntry.device_id   s      )))ro   c           	     j  ^ #    SSK n[        R                  S5        [        R                  " 5       T l        UR                  T R                  S9nU" T R                  [        :X  a  [        T R                  SS9OST R                  T R                  T R                  T R                  S9T l        SU 4S jjnT R!                  5       I Sh  vN (       Ga  T R                  R"                  R%                  [&        U5        [)        T R                  [*        T R,                  5        T R                  R.                  R1                  T R2                  T R4                   Vs/ s H  oD[6        :w  d  M  UPM     sn5      I Sh  vN   [8        R:                  " T R                  5      nUR=                  T R2                  R>                  [@        T RB                  41T R                  RD                  T R                  RF                  T R                  RH                  T R                  RJ                  S	9  [L        T R                  RN                  [@           T RB                     ;   a)  [        R                  S
5        [Q        T R                  T S9  [        R                  ST R4                  5        gg GNs  snf  GN37f)zInit async items in entry.r   NzInitializing Bosch integration.)rX   F)
verify_ssl)sessionsession_typerV   rY   rZ   c                   >#    [         R                  S5        TR                  R                  5       I Sh  vN   g N7f)zClose connection with server.zClosing connection to BoschN)r\   rp   r   close)eventr   s    rQ   close_connection6BoschGatewayEntry.async_init.<locals>.close_connection   s)     MM78,,$$&&&s   3><>)config_entry_ididentifiersmanufacturermodelname
sw_versionzRegistering debug services.ry   z-Bosch component registered with platforms %s.TreturnNone))bosch_thermostat_clientr\   rp   asyncioLockr   gateway_chooserr   r   r	   r   rO   r   r   r   r   async_init_boschbusasync_listen_oncer   r    r<   async_get_signalsrw   async_forward_entry_setupsr   r   rD   dr	async_getasync_get_or_createrv   r3   rU   device_modelrX   device_namefirmwarer6   rN   rG   )r   rr   BoschGatewayr   	componentr   s   `     rQ   rc   BoschGatewayEntry.async_init   s    /78#LLN,,9J9J,K#~~% ,DII%H''++
	'
 &&(((IIMM++,DFVW$		<)?)? ))**EE!!,0,D,D[,DyUZHZ,D[   !ll4995O// $ 1 1 : :$dii01!\\66ll..\\--<<00 0  $))..0;;;<,$))4HMM?(( 5 ) \s8   CJ3
J(BJ3J+
-J+
3
J3=J0>D+J3+J3c                  ^  T R                   (       GdE  [        U 4S jT R                   5       5      (       Ga  [        R	                  S5        ST l         [        T R                  T R                  [        5      T R                  R                  [           T R                     [        '   [        T R                  T R                  [        5      T R                  R                  [           T R                     [        '   [!        T R                  ST R                  5        ["        R$                  " T R'                  5       T R                  R(                  5        ggg)z-Prepare update after all entities are loaded.c              3  |   >#    U  H1  oTR                   R                  [           TR                     ;   v   M3     g 7fri   )rO   rN   r3   rU   ).0kr   s     rQ   	<genexpr>6BoschGatewayEntry.async_get_signals.<locals>.<genexpr>  s.      /
<Tq'		22<Ts   9<z'Registering thermostat update interval.T   N)r   allr   r\   rp   r$   rO   thermostat_refreshr:   rN   r3   rU   r7   firmware_refreshr4   r5   r"   r   run_coroutine_threadsaferecording_sensors_updateloopr   s   `rQ   r   #BoschGatewayEntry.async_get_signals  s     &&&3 /
<@<T<T/
 ,
 ,
 MMCD&*D#:S		422M;DIINN6"499-h7 >W		%%&>DIINN6"499-k:
 TYY4+B+BC,,T-J-J-L		,
&ro   c                  #    [         R                  SU R                  5         U R                  R	                  5       I Sh  vN   U R                  R                  (       d!  [        SU R                  U R                  5      e[         R                  SU R                  R                  5        U R                  R                  (       dp  [        U R                  R                   R#                  [$        5      SS9nU(       a8  [         R'                  S	5        U R                  R)                  U5      I Sh  vN   U R                  R                  (       a  U R                  R+                  5       I Sh  vN n[         R                  S
U 35        U HA  n[,        U   nU H/  nX`R.                  ;  d  M  U R.                  R1                  U5        M1     MC     U R                  U R                  R2                  [4           U R                     [6        '   [         R'                  S5        g GN! [
         a3  n[        U R                  US9  [         R                  U5         SnAgSnAf[        [        4 aP  n[         R                  U5        [         R                  S5        [        SU R                  U R                  5      eSnAff = f GN GNY7f)z Initialize Bosch gateway module.z+Checking connection to Bosch gateway as %s.Nr   Fz&You might need to check your password.z6Cannot connect to Bosch gateway, host %s with UUID: %szBosch BUS detected: %s)defaultzLoading custom db file.zBosch supported capabilities: zBosch initialized.T)r\   rp   r   r   check_connectionr   r   rO   errorr   r   r   rU   bus_typedatabaser)   rP   path	CUSTOM_DBr]   custom_initializeget_capabilitiesSUPPORTED_PLATFORMSr   appendrN   r3   r6   )r   err	custom_dbsupported_bosch	supportedelementselements          rQ   r   "BoschGatewayEntry.async_init_bosch/  s    CTZZP	,,//111 ||  %H

		 
 	.0E0EF||$$!$))"2"2"7"7	"BDQI67ll44Y???<<  $(LL$A$A$CCOMM:?:KLM,	.y9'G&>&>>0077@  ( -
 6:\\		vtyy)'2)*G 2! 	(diiSAMM#23 	MM#MMBC%H

		 	& @Css   !KH' H$H' C,K2K3<K/K0<K0A4K$H' '
K1)IKK2AJ==KKKNc                \  #    U R                   R                  [           U R                     R	                  [
        / 5      nU(       d  gU R                   R                  [           U R                     R                  [        S5      nUb	  U" 5         SnSn/ n[        R                  " 5       nU H  nUR                  (       d  M   [        R                  S[        U 5      5        UR                  R                  US9I Sh  vN   SnUR                   U;  a  UR#                  UR                   5        M  M     S nU" U[+        SS	9-   5      n	[-        U R                   U R.                  U	5      U R                   R                  [           U R                     [        '   [        R                  S
U	5        U(       a5  [        R                  S5        U H  n
[1        U R                   U
5        M     gg N! [$         a-  n[        R'                  SUR(                  U5         SnAGMv  SnAff = f7f)znUpdate of 1-hour sensors.

It suppose to be called only once an hour
so sensor get's average data from Bosch.
NFz&Updating component 1-hour Sensor by %s)timeT4Bosch object of entity %s is no longer available. %sc                l    S/nS/n[         R                  " SSS5      n[         R                  " XX#5      $ )Nr      *   )dt_utilparse_time_expressionfind_next_time_expression_time)tmatching_secondsmatching_minutesmatching_hourss       rQ   rounder;BoschGatewayEntry.recording_sensors_update.<locals>.roundery  s?     !s !s$::32FN99%5 ro   r+   )secondsz.Next update of 1-hour sensors scheduled at: %szBosch 1-hour entitites updated.)rO   rN   r3   rU   getr   rj   r9   r   nowenabledr\   rp   idbosch_objectupdatesignalr   r   warningr   r   r#   r   r!   )r   r   entitiesrecording_callbackupdatedsignalsentityr   r   nextir   s              rQ   r   *BoschGatewayEntry.recording_sensors_updateX  s     99>>&)$))488BG!YY^^F3DII>BB
 ) !%kkmF~~~MM"JBtHU --44#4>>>"G}}G3v}}5 4 	 i223 *IIt44e
 			vtyy)	

 	FNMM;<!%dii8 "	 5 ? ' OON sC   B>H,;G2 G01G22B>H,0G22
H)<!H$H,$H))H,c                R   #    U R                   R                  XS9I Sh  vN   g N7f)z-Send PUT directly to gateway without parsing.)r   rl   N)r   raw_put)r   r   rl   s      rQ   
custom_putBoschGatewayEntry.custom_put  s      ll""":::s   '%'c                   #    U R                    ISh  vN   U R                  R                  US9I Sh  vN sSSS5      ISh  vN   $  N6 N N	! , ISh  vN  (       d  f       g= f7f)zFetch value from gateway.N)r   )r   r   	raw_query)r   r   s     rQ   
custom_getBoschGatewayEntry.custom_get  sE     $$$//T/:: %$$: %$$$sS   A*A
A*AAAA*AA*AA*A'AA'#A*c           	     R  #    XR                   ;   a  SnU R                  R                  [           U R                     U   nU Hf  nUR
                  (       d  M   [        R                  SUUR                  [        U 5      5        UR                  R                  5       I Sh  vN   SnMh     U(       a7  [        R                  SU S35        [        U R                  [         U   5        gg NI! [         a,  n[        R                  SUR                  U5         SnAM  SnAff = f7f)z.Update data from HC, DHW, ZN, Sensors, Switch.FzUpdating component %s %s by %sNTr   zBosch z entitites updated.)r   rO   rN   r3   rU   r   r\   rp   	entity_idr   r   r   r   r   r   r!   SIGNALS)r   component_type
event_timer   r   r   r   s          rQ   component_update"BoschGatewayEntry.component_update  s     555Gyy~~f-dii8HH">>><*",,tH	 %1188:::"& #" ~&99LMN%dii1HI ;* R"KK sD   AD'AC."C,#C.)AD',C..
D$8!DD'D$$D'c                  #    U R                   R                  5       (       a  [        R                  S5        g[        R                  S5        U R                    ISh  vN   U R	                  [
        U5      I Sh  vN   U R	                  [        U5      I Sh  vN   U R	                  [        U5      I Sh  vN   U R	                  [        U5      I Sh  vN   U R	                  [        U5      I Sh  vN   U R	                  [        U5      I Sh  vN   [        R                  S5        SSS5      ISh  vN   g N N N N Nn NR N6 N! , ISh  vN  (       d  f       g= f7f)z"Call Bosch to refresh information.)Update already in progress. Not updating.Nz$Updating Bosch thermostat entitites.z;Finish updating entities. Waiting for next scheduled check.)r   lockedr\   rp   r  r   r.   r0   rF   r*   r
   )r   r  s     rQ   r   $BoschGatewayEntry.thermostat_refresh  s     ##%%MMEF<=$$$''
;;;''zBBB''<<<''jAAA''
;;;''
;;;MMWX %$$;B<A;; %$$$s   AE&D<E&!E;D><EE E7E8EEE3E4EEE+E&6E
7E&>E EEEEE
E&E#EE#E&c                  #    U R                   R                  5       (       a  [        R                  S5        g[        R                  S5         U R                    ISh  vN   U R                  R                  5       I Sh  vN   SSS5      ISh  vN   g N7 N N	! , ISh  vN  (       d  f       g= f! [         a  n[        U R                  US9   SnAgSnAff = f7f)z$Call Bosch to refresh firmware info.r  Nz#Updating info about Bosch firmware.r   )	r   r  r\   rp   r   check_firmware_validityr   r   rO   )r   r  r   s      rQ   r   "BoschGatewayEntry.firmware_refresh  s     ##%%MMEF;<	B(((ll::<<< )((< )(((  	B(diiSA	Bs   AC!B6 BB6 "B BBB6 BB6 C!B6 BB6 B3"B%#B3/B6 2C!3B6 6
C CC!CC!c           
       #    0 nU R                    ISh  vN   [        R                  S5        [        U R                  SS[
        S9  U R                  R                  5       I Sh  vN n [        X5        SR                  [        U R                  5      S[        R                  " S	S
5      5      n[        R                  SU 35        [        U R                  SSU SU S3[
        S9  SSS5      ISh  vN   U$  N N! [        [        4 a@  n[        R                  SU5        U(       a  Us SnAsSSS5      ISh  vN    $  SnANSnAff = f N]! , ISh  vN  (       d  f       U$ = f7f)zCreate rawscan from service.Nz#Starting rawscan of Bosch componentz
Bosch scanzStarting rawscanr{   zCan't create file. %sz{}{}{}z/local/bosch_scan.json?vr   i  zRawscan success. Your URL: [z]())r   r\   r]   r   rO   r8   r   rawscanr%   FileNotFoundErrorOSErrorr   formatr&   randomrandint)r   filenamer  r   urls        rQ   make_rawscanBoschGatewayEntry.make_rawscan  s2    $$$LL>?0		"+ /	 !LL0022G#(,
 //		"*q$'C
 LL6se<=0		"SEC5* /	+ %$6 7 % 3 &w/ #5s;"N %$$ # %$$6 s   E1C=E1AE&C?'E,D7A4E+E16E7E1?EEE/E0E4E1 EE1EEEE1E.EE.)E1c                  #    [         R                  S5        [         R                  S5        U R                   Vs/ s H3  nU R                  R
                  R                  U R                  U5      PM5     nn[        R                  " U6 I Sh  vN nU R                  R                  SS9I Sh  vN   [        U5      $ s  snf  N5 N7f)z#Reset this device to default state.zUnloading Bosch module.zClosing connection to gateway.NF)force)r\   r   rp   r   rO   rw   async_forward_entry_unloadr   r   gatherr   r   r   )r   platformtasksrs   s       rQ   rq   BoschGatewayEntry.async_reset  s     1267
 !44	"
 5 II$$??!!8 5	 	 "
 "..%00	ll  u ---9~"
 1-s.   9C:B>5CC C.C/CC)r   r   r   r   r   r   r   r   r   r   r   rO   r   r   rU   r   )r   str)r   boolri   )r   zbool | None)r   r)  rl   r   r   r   )NN)r  r)  r   dict)__name__
__module____qualname____firstlineno____doc__r   propertyr   rc   r   r   r   r   r  r  r  r   r   r   rq   __static_attributes__ ro   rQ   rb   rb      sr    +!	!( * *0d  ('R4l;;
8Y
B@ro   rb   )rO   r   rP   r'   )rO   r   r[   r   )rO   r   )r0  
__future__r   r   loggingr  collections.abcr   datetimer   typingr   'homeassistant.helpers.config_validationhelpersconfig_validationcv
voluptuousvolbosch_thermostat_client.constr   r   r	   r
   r   r   r   r   r   )bosch_thermostat_client.const.easycontrolr   "bosch_thermostat_client.exceptionsr   r   r   r   bosch_thermostat_client.versionr   r^   0homeassistant.components.persistent_notificationr   r   homeassistant.config_entriesr   homeassistant.constr   r   r   homeassistant.corer   r   homeassistant.exceptionsr   homeassistant.helpersr   r   $homeassistant.helpers.aiohttp_clientr    homeassistant.helpers.dispatcherr    r!   homeassistant.helpers.eventr"   r#   r$   homeassistant.helpers.jsonr%   homeassistant.helpers.networkr&   homeassistant.helpers.typingr'   homeassistant.utilr(   r   homeassistant.util.jsonr)   custom_components.bosch.switchr*   constr,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   servicesrG   rH   rI   r	  r   r   SchemaRequired
entity_idsSERVICE_DEBUG_SCHEMAintSERVICE_INTEGRATION_SCHEMATASKDATA_CONFIGS	getLoggerr,  r\   HOURrR   rf   rt   ra   r   rb   r3  ro   rQ   <module>r^     s   7 "    %   4 4 
 
 
 9  F 5 
 7 8 7 H 
 1 1 3 , - 1       :  ()
&4	$
M
M
M	 	,
VH
VH
VH
V]#	
  #	zz3<<#?"OP  ZZd);S(AB 


H
%q.(; m mro   