
    i,                       S r SSKJr  SSKrSSKJrJr  SSKJr  SSKJ	r	  SSK
JrJr  SS	KJrJrJrJr  SS
KJr  SSKJrJr  SSKJrJr  \R6                  " \5      rSS\R<                  \R>                  S.SS\R@                  \RB                  S.SS\R@                  \RB                  S./r"SS\R<                  S \R>                  S.SS\RF                  \RH                  S.SS\RF                  \RH                  S./r% " S S\	5      r&g)z+Bosch sensor for Energy URI in Easycontrol.    )annotationsN)	timedeltadatetime)UNITS   )StatisticHelper)SensorDeviceClassSensorStateClass)UnitOfEnergyUnitOfTemperatureUnitOfVolumeSTATE_UNAVAILABLE)dt)StatisticDatatimestamp_to_datetime_or_none   )SIGNAL_ENERGY_UPDATE_BOSCHVALUEzenergy temperatureT)nameattrunitOfMeasuredeviceClasszenergy central heatingCHzenergy hot waterHWzecus avg outdoor temperaturec                    U S-  $ )N
    )xs    0/config/custom_components/bosch/sensor/energy.py<lambda>r!   3   s    q2v    )r   r   r   	normalizer   zcentral heatingz	hot waterc                     ^  \ rS rSrSr\rSr  SU 4S jjr\	SS j5       r
SS j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rU =r$ )EnergySensorE   z Representation of Energy Sensor.Energyc                  > SU l         UR                  S5      U l        UR                  S5      U l        U R                   U R                   U 3U l        [        TU ]  " SUR                  S5      US.UD6  UR                  [        5      U l	        UR                  S[        R                  5      U l        U R                  (       a5  U R                  [        R                  :X  a  [        R                   U l        ggg)zInitialize Energy sensor.Nr   r#   r   )r   uuidr   r   )_attr_read_keyget_read_attr_to_search
_normalize_domain_name_attr_unique_idsuper__init__r   _unit_of_measurementr	   ENERGY_attr_device_class_attr_state_classTEMPERATUREr
   MEASUREMENT)selfsensor_attributesr)   kwargs	__class__s       r    r1   EnergySensor.__init__K   s     #$5$9$9&$A!+//<"&"3"3!4T5N5N4OPTvVQ/33F;$Q&Q$5$9$9%$@!"3"7"7,33#
 ""''+<+H+HH&6&B&BD# I #r"   c                    g)zDevice name.zEnergy sensorsr   r8   s    r    device_nameEnergySensor.device_nameb   s      r"   c                  ^ ^#    T R                   R                  T R                  5      nUR                  [        5      mU U4S jnT(       a  U" 5       (       d+  [
        R                  ST R                  5        [        T l	        T R                  (       aU  T R                  [        R                  :X  d  T R                  [        R                  :X  a  T R!                  5       I Sh  vN   OaT R"                  (       a0  T R#                  TR                  T R$                  5      5      T l	        O TR                  T R$                  5      T l	        T R&                  (       a  ST l        T R)                  5         gg N7f)zUpdate state of device.c                    > TR                   (       d1  T H*  n TR                  U R                  5       ;   d  M#  U Tl           g   Og[        R	                  STR                   5        [
        Tl        g)NTz"Reading attribute not available %sF)r*   r,   upper_LOGGERdebugr   _state)r   r8   values    r    search_read_attr3EnergySensor.async_update.<locals>.search_read_attrl   sY    &&!D00DJJL@.2+# "
 MM>@S@ST+DKr"   z#Energy sensor data not available %sNF)_bosch_objectget_property	_attr_urir+   r   rD   rE   _namer   rF   _new_stats_apir2   r   KILO_WATT_HOURr   CUBIC_METERS_insert_statisticsr-   r*   _update_initasync_schedule_update_ha_state)r8   datarH   rG   s   `  @r    async_updateEnergySensor.async_updateg   s     !!..t~~>
	 ,..MM?L+DK%%)D)DD((L,E,EE))+++"ooeii8K8K.LM#ii(;(;< %D//1  ,s   C E7$E5%BE7c                    U R                   (       d1  U R                  R                  SS5      R                  SS5      U l         U R                   SU R                   U R                    S3R                  5       $ )zExternal API statistic ID.. sensor:external)	_short_id	entity_idreplacer.   r*   lowerr>   s    r    statistic_idEnergySensor.statistic_id   se     ~~!^^33C<DDXrRDN  !4#6#6"77GxPVVX	
r"   c                    / nUnUnXb:  a;  [        Xs-   S5      nUR                  [        UUUS95        U[        SS9-   nXb:  a  M;  Xu4$ )Nr   )startstatesumr   hours)roundappendr   r   )r8   rd   endsingle_value
init_value
statisticsnow_sums           r     _generate_easycontrol_statistics-EnergySensor._generate_easycontrol_statistics   si     
i,a0D& 	**C i !!r"   c                   #    [         R                  SUUU R                  5        U R                  R	                  XS9I Sh  vN $  N7f)z(Rename old entity_id in statistic table.z%Attempt to fetch range %s - %s for %s
start_time	stop_timeN)rD   rE   ra   rJ   fetch_range)r8   ru   rv   s      r    fetch_past_dataEnergySensor.fetch_past_data   sP     3		
 ''33! 4 
 
 	
 
s   ?AAAc                  #    [         R                  " 5       nX1-
  nUR                  UR                  :X  a  [        R	                  S5        g U[        SS9:  a  [        R	                  S5        [         R                  " U5      nU R                  XQ[        SS9-   S9I S h  vN nUR                  S5      nU(       a  Xv;  a  [        R                  S	5        g Xg   n[        XR                     S
-  S5      n	U R                  U[        SS9-
  US9I S h  vN n
U
R                  U R                  5      nU(       a  US   R                  SS5      OSnU R                  UU[        SS9-   U	US9u  pU R!                  US9  g  N Nm7f)Nz,Can't upsert today date. Try again tomorrow.<   daysz\Update more than 60 days in past might take some time! Component will try to do that anyway!   rg   rt   %d-%m-%YzNo stats found. Exiting.   r   r   ru   end_timer   rf   rd   rk   rl   rm   stats)dt_utilro   dayrD   warnr   start_of_local_dayrx   strftimerE   ri   r*   get_stats_from_ha_dbr+   ra   rq   add_external_stats)r8   rd   stopro   diffru   r   _day_dtday_data_value
last_stats	last_statrp   rn   s                 r    _upsert_past_statistics$EnergySensor._upsert_past_statistics   s|    kkm{77eiiLLGH)$$LLn //6
**!YR5H-H + 
 
 %%j1,MM45>x 3 34r91=44yq11C 5 
 

 NN4#4#45	-6y|q)A@@YA..	 A 
 	j1)

s&   BF F !A3FFA,FFc           	        / n[         R                  " 5       nU H  n[        R                  " US   S5      nUR	                  UR
                  UR                  UR                  S9n[        XPR                     S-  S5      nU R                  UU[        SS9-   UUS9u  p)X9-  n[        R                  S	U R                  UUU5        M     U R                  US
9  U$ )Ndr   )yearmonthr   r   r   r   r|   r   zKAppending day to statistic table with id: %s. Date: %s, state: %s, sum: %s.r   )r   r   r   strptimer_   r   r   r   ri   r*   rq   r   rD   rE   ra   r   )
r8   r   rf   statistics_to_pushstart_of_daystatday_dt_dater   rn   s
             r    append_statisticsEnergySensor.append_statistics   s    113D'00cJGF (([[&** ) E 4 3 34r91=F"CCI1--#	 D OC ,MM]!! ( 	&89
r"   c                  ^ ^	^
^#    SnT R                  5       I Sh  vN n[        U5      S:X  d  [        UT R                     5      S:X  a{  [        R	                  S5        [        T R                  R                  5       I Sh  vN R                  5       5      nU(       d  [        R                  S5        gT R                  X1S9  g[        R                  " 5       nUR                  SSSSS9[        SS9-
  n[        R                  " U5      m
U[        SS9-
  mUT R                     S   n[!        US	   5      nU(       a<  UT
::  a6  T R#                  [        R$                  " U5      [        S
S9-
  TS9I Sh  vN O+T R#                  T
[        SS9-
  T[        SS9-
  S9I Sh  vN m	U	U U
U4S jnT R                  T	;   a!  U" 5       I Sh  vN u  p1T R                  X1S9  gg GN GNd Nq NG N!7f)z Insert statistics from the past.r   Nz/Last stats not exist. Trying to fetch ALL data.zStats not found.)r   rf   )hourminutesecondmicrosecondr   r|   rd      rg   r   c            	       >#    TR                  TTS9n U S   nU S   =(       d    Sn[        U[        5      (       a  [        U5      nU(       d"  [        R                  STR                  U5        OUR                  5       TR                  5       [        SS9-
  :  a  [        R                  STR                  UU5        TR                  UTS	9I S h  vN nUR                  5        Vs/ s H9  n[        R                  " [        R                  " US
   S5      5      U:  d  M7  UPM;     snU4$ [        R                  STR                  5        TR                  R                   R                  5       U4$  Ns  snf 7f)N)r   r   rd   rf   r   z!Start time not found. %s found %sr   r|   zNLast row of statistic %s found %s, missing more than 1 day with current sum %srt   r   r   z,Returning state to put to statistic table %s)get_last_stats_before_date
isinstancefloatr   rD   rE   ra   dater   rx   valuesr   r   r   r   rJ   
last_entry)	last_stats_rowru   rp   
bosch_datarowr   r8   start_of_yesterday_utc	yesterdays	        r    get_last_stats_from_bosch_apiFEnergySensor._insert_statistics.<locals>.get_last_stats_from_bosch_api  sv    !<<%+A = N (0J!%(-AD*e,,::F
79J9JJ "Y^^%5	q8I%IId%%	 $(#7#7)Y $8 $ 
 $.#4#4#6#6C"55$--c#h
C %% #6 
 
 MM>@Q@Q %%007794??%s+   CE:E3E:(6E5"E5(AE:5E:)get_last_statlenra   rD   rE   listrJ   	fetch_allr   r   r   r   ro   r_   r   as_utcr   r   r   )r8   rp   r   	all_statsro   start_of_yesterdaylast_stat_rowlast_stat_startr   r   r   r   s   `        @@@r    rQ   EnergySensor._insert_statistics   s    ,,..	y>Q#i0A0A&B"Cq"HMMKLD$6$6$@$@$BBJJLMI/0"""=kkm [[1QA ) 
1 ")0B!C)++	!$"3"34Q77g8NO ?6L#L ++"55oF!$%" ,    001IA4FF"YQ%77 1   	%	@ %	@N 
*$A$CCOI"""= +Q / C$\ DsY   G0G$A&G0G'C4G08G*9+G0$G,%'G0G.G0'G0*G0,G0.G0)	r4   r*   r/   r-   r,   r]   rF   r2   rR   )returnNone)r   str)
rd   r   rk   r   rl   intrm   r   r   ztuple[int, list[StatisticData]])ru   r   rv   r   r   dict)rd   r   r   r   r   r   )r   r   )__name__
__module____qualname____firstlineno____doc__r   signalr.   r1   propertyr?   rU   ra   rq   rx   r   r   rQ   __static_attributes____classcell__)r;   s   @r    r%   r%   E   s    *'FLC
 
C.    !2F 
 
""$,"<?"MP"	("$

2B4M> M>r"   r%   )'r   
__future__r   loggingr   r   bosch_thermostat_client.constr   statistic_helperr   homeassistant.components.sensorr	   r
   homeassistant.constr   r   r   r   homeassistant.utilr   r   (homeassistant.components.recorder.modelsr   r   constr   r   	getLoggerr   rD   CELSIUSr6   rO   r3   EnergySensorsrP   GASEcusRecordingSensorsr%   r   r"   r    <module>r      s   1 "  ( / - O  - 6


H
% %*22(44	 )%44(//	 #%44(//	. /*22%(44 "%22(,,	 %22(,,	 .t>? t>r"   