
    i/                       S r SSKJr  SSKrSSKrSSKJr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  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  \R<                  " \5      r  " S S\5      r!g! \ a	    SSKJr   NJf = f)z3Bosch statistic helper for Recording/Energy sensor.    )annotationsN)datetime	timedelta)StatisticDataStatisticMetaDatadatetime_to_timestamp_or_none)IntegrityError)dt)StatisticsMeta)session_scope)async_add_external_statisticsget_last_statisticsstatistics_during_periodStatisticsRow)get_instance   )BoschBaseSensorc                     ^  \ rS rSrSrSSU 4S jjjrSSS jjr\SS j5       r\S 5       r	\SS j5       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U =r$ )StatisticHelper    zStatistic helper class.c                t   > SU l         Xl        [        R                  " 5       U l        [
        TU ]  " S0 UD6  g)zInitialize statistic helper.N )	_short_id_new_stats_apiasyncioLock_statistic_import_locksuper__init__)selfnew_stats_apikwargs	__class__s      :/config/custom_components/bosch/sensor/statistic_helper.pyr   StatisticHelper.__init__#   s.    +&-lln#"6"    c           
     r  #    U R                   n[        R                  S5         [        U R                  S9 nUR                  [        5      R                  [        R                  U:H  [        R                  S:H  -  5      R                  [        R                  U R                  [        R                  U R                  R                  5       [        R                  SU R                   305        SSS5        g! , (       d  f       g= f! [         a   n[        R!                  SU5         SnAgSnAff = f7f)z?Rename old entity_id in statistic table. Not working currently.z.Moving entity id statistic data to new format.)hassrecorderStats Nz+Can't move entity id. It already exists. %s)	entity_id_LOGGERdebugr   r(   queryr   filterstatistic_idsourceupdate_domain_namelowername_namer	   error)r    
event_timeold_entity_idsessionerrs        r$   move_old_entity_data_to_new+StatisticHelper.move_old_entity_data_to_new*   s     FG	NDII.'n-44#00MA%,,
:< &&33T5F5F&--t/@/@/F/F/H&++vdjj\-B	 /..  	NMMGMM	NsR   "D7D
 B8C90D
 8D79
DD
 D7D
 

D4D/*D7/D44D7c                    [        5       e)zExternal API statistic ID.NotImplementedErrorr    s    r$   r0   StatisticHelper.statistic_id=   s     "##r&   c                    g)zDon't poll.Fr   rA   s    r$   should_pollStatisticHelper.should_pollB   s     r&   c           	         [        SSSU R                   3U R                  R                  5       U R                  U R
                  S9$ )z(Statistic Metadata recorder model class.FTr*   )has_meanhas_sumr5   r1   r0   unit_of_measurement)r   r6   r3   r4   r0   _unit_of_measurementrA   s    r$   statistic_metadata"StatisticHelper.statistic_metadataG   sI     !$**&$$**,** $ 9 9
 	
r&   c           	        #    [        U R                  5      R                  [        U R                  SU R                  SSS15      I S h  vN $  N7f)Nr   Tstatesum)r   r(   async_add_executor_jobr   r0   rA   s    r$   get_last_statStatisticHelper.get_last_statS   sL     !$)),CCIIe
 
 	
 
s   AA	A
Ac                   #    [        U R                  5      R                  [        U R                  UUU R                  /SSSS15      I Sh  vN $  N7f)zGet stats during period.hourNrN   rO   )r   r(   rP   r   r0   )r    
start_timeend_times      r$   get_stats_from_ha_db$StatisticHelper.get_stats_from_ha_db]   sW      "$)),CC$IIe	
 	
 		
 	
s   A
AAAc                    SU l         U(       d  g[        U R                  U R                  U5        U R	                  5         g)zAdd external statistics.iN)_stater   r(   rK   async_schedule_update_ha_state)r    statss     r$   add_external_stats"StatisticHelper.add_external_statsl   s1    %dii1H1H%P++-r&   c                L   [        U5      nS nXR                      H6  nUR                  S5      nXc:  d  M  Ub  XdR                  S5      :  d  M4  UnM8     U(       d&  XR                     S   n[        R	                  S5        [        R	                  SU R                  U5        U$ )Nstartz0Closest stat not found, use last one from array!zLast stat for %s found %s)r   r0   getr,   r-   )r    
last_statsday	day_stampclosest_statstattstmps          r$   get_last_stats_before_date*StatisticHelper.get_last_stats_before_datet   s     2#6	001DHHW%E '53C3CG3L+L#'L	 2
 %&7&78<LMMLM'):):L	
 r&   c                  #    [         R                  " U5      nU[        SS9-   nU R                   ISh  vN   U R	                  X#S9I Sh  vN   SSS5      ISh  vN   g N, N N	! , ISh  vN  (       d  f       g= f7f)z'Attempt to put past data into database.   )hoursN)r`   stop)dt_utilstart_of_local_dayr   r   _upsert_past_statistics)r    rU   r`   rn   s       r$   insert_statistics_range'StatisticHelper.insert_statistics_range   sc     **:6yr**.....U.FFF /..F /...sV   3BA"BA(A$A(BA&B$A(&B(A?.A1/A?;Bc                   #    [         R                  " U5      n[        R                  SUUU R                  5        U R
                  R                  XS9I Sh  vN nU$  N7f)z(Rename old entity_id in statistic table.z%Attempt to fetch range %s - %s for %s)rU   	stop_timeN)ro   rp   r,   r-   r0   _bosch_objectfetch_range)r    rU   ru   my_ranges       r$   fetch_past_dataStatisticHelper.fetch_past_data   sf      //
;
3		
 ++77! 8 
 
 
s   AA AA c                   #    [         e7fNr?   )r    r`   rn   s      r$   rq   'StatisticHelper._upsert_past_statistics   s      "!s   	)r   r   rZ   r   )F)r!   boolr|   )returnNone)r   str)r   r   )r   dict[str, list[StatisticsRow]])rU   r   rV   r   r   r   )r\   zlist[StatisticData]r   r   )rc   r   rd   r   )rU   r   r   r   )rU   r   ru   r   r   dict)r`   r   rn   r   r   r   )__name__
__module____qualname____firstlineno____doc__r   r<   propertyr0   rD   rK   rQ   rW   r]   ri   rr   ry   rq   __static_attributes____classcell__)r#   s   @r$   r   r       s    !# #N& $ $   	
 	


"
.6
	'
.8?G$G"/7	 ""%-"	" "r&   r   )"r   
__future__r   loggingr   r   r   (homeassistant.components.recorder.modelsr   r   r   sqlalchemy.excr	   homeassistant.utilr
   ro   +homeassistant.components.recorder.db_schemar   ImportError&homeassistant.components.recorder.utilr   ,homeassistant.components.recorder.statisticsr   r   r   r   !homeassistant.components.recorderr   baser   	getLoggerr   r,   r   r   r&   r$   <module>r      s{    9 "   ( 
 * ,HJ A  ; !


H
%@"o @"  HGHs   A2 2B B