+
    G.jK^                     `   R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t^ RIt^ RItRtRtRtRt ! R R]P(                  P*                  4      t ! R R	]P.                  ]P(                  P0                  4      t]R
8X  d(   ]! R] R24       ]! R]3]4      P9                  4        R# R# )z_Simple device dashboard server. Serves HTML + proxies HA API + saves device names + TV control.Nzhttp://supervisor/core/apiz/share/device_names.jsoni"  z"/share/.ha_cache/.ha_wd_state.jsonc                     a a ] tR t^t oV 3R ltV 3R ltV 3R ltR tR tR t	R t
R tR#R	 ltR$R
 ltR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR t R t!R#R lt"R$R  lt#R! t$R"t%Vt&V ;t'# )%Handlerc                ,   < \         SV `  ! VR R/VB  R# )	directoryz/share/.ha_cacheN)super__init__)selfargskwargs	__class__s   &*,/share/.ha_cache/ha_webui.pyr   Handler.__init__   s    $G*<GG    c                   < V P                   P                  R 4      '       g   V P                   R8X  d7   V P                  RR4       V P                  RR4       V P                  RR4       \        SV `  4        R# )	z.html/zCache-Controlz#no-cache, no-store, must-revalidatePragmazno-cacheExpires0N)pathendswithsend_headerr   end_headersr   r   s   &r   r   Handler.end_headers   s_    99g&&$))s*:_.STXz2Y,r   c                B  < V P                   P                  R 4      '       d   V P                  R4       R# V P                   R8X  d   V P                  4        R# V P                   R8X  d   V P	                  4        R# V P                   P                  R4      '       d   V P                  4        R# V P                   R8X  d   V P                  4        R# V P                   R8X  d   V P                  4        R# V P                   R8X  d   V P                  4        R# V P                   P                  R4      '       d   V P                  4        R# V P                   R	8X  d   V P                  4        R# V P                   R
8X  d   V P                  4        R# \        SV `5  4        R# )/api/GETz/device_names.jsonz
/tv/statusz/tv/screenshotz/tv/deficitz/sandman/statusz/sandman/historyz/sandman/log/sandman/configz/tv/throttle_statusN)r   
startswith	_proxy_ha_serve_names
_tv_status_tv_screenshot_tv_deficit_sandman_status_sandman_history_sandman_log_sandman_config_get_tv_throttle_statusr   do_GETr   s   &r   r)   Handler.do_GET"   s   99((NN5!YY..YY,&OOYY!!"233!YY-'YY++  "YY,,!!#YY!!.11YY++$$&YY//$$&GNr   c                   V P                   R 8X  d   V P                  4        R# V P                   P                  R4      '       d   V P                  R4       R# V P                   R8X  d   V P	                  4        R# V P                   R8X  d   V P                  4        R# V P                   R8X  d   V P                  4        R# V P                   R8X  d   V P                  4        R# V P                   R8X  d   V P                  4        R# V P                   R8X  d   V P                  4        R# V P                   R	8X  d   V P                  4        R# V P                   R
8X  d   V P                  4        R# V P                   R8X  d   V P                  4        R# V P                   R8X  d   V P                  4        R# V P                   R8X  d   V P                  4        R# V P                   R8X  d   V P                  4        R# V P!                  R4       R# )z/save_namesr   POSTz/tv/keyz
/tv/launchz/tv/ambilightz
/tv/volumez/tv/mutez/tv/throttlez/sandman/deficitz/sandman/speedz/sandman/resetr   z/sandman/test_actionz/sandman/pausei  N)r   _save_namesr   r   _tv_key
_tv_launch_tv_ambilight
_tv_volume_tv_mute_tv_throttle_sandman_set_deficit_sandman_set_speed_sandman_reset_sandman_config_set_sandman_test_action_sandman_pause
send_error)r   s   &r   do_POSTHandler.do_POST:   sc   99%YY!!'**NN6"YY)#LLNYY,&OOYY/) YY,&OOYY*$MMOYY.(YY,,%%'YY**##%YY**!YY++$$&YY00%%'YY**!OOC r   c                l    \        \        4      ;_uu_ 4       pVP                  4       pR R R 4       T P	                  ^4       T P                  RR4       T P                  4        T P                  P                  XP                  4       4       R #   + '       g   i     Ln; i  \         d    Rp Li ; i)Nz{}Content-Typeapplication/json)
open
NAMES_FILEreadFileNotFoundErrorsend_responser   r   wfilewriteencode)r   fdatas   &  r   r    Handler._serve_namesZ   s    	j!!Qvvx " 	3);<

' "!  	D	s-   B# BB# B 	B#  B# #B32B3c           	        \        V P                  P                  R ^ 4      4      pV'       d   V P                  P	                  V4      MRp \
        P                  ! V4      p\        \        R4      ;_uu_ 4       p\
        P                  ! W4^RR7       RRR4       V P                  ^4       V P                  RR4       V P                  4        V P                  P                  R4       R#   + '       g   i     L`; i  \         du   pT P                  R	4       T P                  4        T P                  P                  \
        P                   ! R
\#        T4      /4      P%                  4       4        Rp?R# Rp?ii ; i)Content-Lengths   {}wF)indentensure_asciiNr>   r?   s   {"ok":true}  error)intheadersgetrfilerB   jsonloadsr@   rA   dumprD   r   r   rE   rF   	ExceptiondumpsstrrG   )r   lengthbodynamesrH   es   &     r   r-   Handler._save_namese   s   T\\%%&6:;*0tzzv&e	EJJt$Ej#&&!		%15A 's#^-?@JJ^, '&  	Es#JJTZZ#a&(9:AACDD	Es2   .C? :C,AC? ,C<	7C? ?E>
A)E99E>c           	     X   V P                   R ,          p\         V 2p RpVR8X  dK   \        V P                  P	                  R^ 4      4      pV'       d   V P
                  P                  V4      MRp\        P                  P                  W4RR\        P                   2RR/VR7      p\        P                  P                  V^
R	7      pVP                  4       pV P                  ^4       V P                  RR4       V P                  4        V P                   P#                  V4       R#   \$         du   p	T P                  R
4       T P                  4        T P                   P#                  \&        P(                  ! R\+        T	4      /4      P-                  4       4        Rp	?	R# Rp	?	ii ; i):   NNNr,   rL   AuthorizationzBearer r>   r?   )rI   rS   method)timeouti  rQ   )r   HA_URLrR   rS   rT   rU   rB   urllibrequestRequest
tv_controlSUPERVISOR_TOKENurlopenrD   r   r   rE   rF   rY   rV   rZ   r[   rG   )
r   rd   ha_pathurlr]   r\   reqresprI   r_   s
   &&        r   r   Handler._proxy_hau   s\   ))B-	"	EDT\\--.>BC28tzzv.d..(((GJ4O4O3P*QSacuv ) C
 >>))#r):D99;Ds#^-?@JJT" 	Es#JJTZZ#a&(9:AACDD	Es   D	D* *F)5A)F$$F)c                    \        V P                  P                  R ^ 4      4      pV'       d0   \        P                  ! V P
                  P                  V4      4      # / # )rL   )rR   rS   rT   rV   rW   rU   rB   )r   r\   s   & r   
_read_bodyHandler._read_body   sA    T\\%%&6:;6<tzz$**//&12D"Dr   c                    \         P                  ! V4      P                  4       pV P                  V4       V P	                  R R4       V P                  4        V P                  P                  V4       R# r>   r?   N)rV   rZ   rG   rD   r   r   rE   rF   )r   objstatusrI   s   &&& r   _json_okHandler._json_ok   sU    zz#%%'6");<

r   c                .    V P                  R V/V4       R# )rQ   N)ry   r   msgrx   s   &&&r   	_json_errHandler._json_err   s    wnf-r   c                    / p\         P                  ! 4       VR &   \         P                  ! 4       pVR,          VR&   VR,          VR&    \         P                  ! 4       w  r4pV'       d    \         P                  P                  W34      MRVR&   T;'       g    / P                  RR4      VR&   T;'       g    / P                  RR4      VR&   T;'       g    / P                  R^ 4      VR&    \        \        4      ;_uu_ 4       p\        P                  ! V4      pR	R	R	4       XP                  R
^ 4      VR
&   VP                  R^ 4      VR&   VP                  R^ 4      VR&   V P                  V4       R	#   \         d    RTR&   RTR&   RTR&   ^ TR&    Li ; i  + '       g   i     L; i  \         d    ^ TR
&   ^ TR&   ^ TR&    Lgi ; i  \         d&   pT P                  \        T4      4        R	p?R	# R	p?ii ; i)powervolumemutedUnknownapptitle artist
position_sNdeficitsession_mintotal_today_min)rj   get_power_stateget_audio_stateadb_get_current_app	APP_NAMESrT   rY   r@   SANDMAN_STATErV   loadry   r~   r[   )	r   resultaudiopkgplaybackextrasrH   smr_   s	   &        r   r!   Handler._tv_status   s   "	#F(88:F7O..0E$XF8#GnF7O
)(2(F(F(H%vFI
 4 4 8 8 Byu#)<<R"4"4Wb"Aw$*LLb#5#5h#Cx (."'9'9,'J|$	.-((A1B )$&FF9a$8y!(*}a(@}%,.FF3Da,H() MM&!%  ) )u"$w#%x '(|$	) )(
  .$%y!()}%,-().  	#NN3q6""	#s   AG 
AE4 E4 6E4 E4 ,F, FAF, !G 4FG FG F)	$F, ,G	G G		G G<G77G<c                    V P                  4       pVP                  R R4      p\        P                  ! V4       V P	                  RRR V/4       R#   \
         d&   pT P                  \        T4      4        Rp?R# Rp?ii ; i)keyr   okTN)rs   rT   rj   js_keyry   rY   r~   r[   )r   r]   r   r_   s   &   r   r.   Handler._tv_key   si    	#??$D((5"%Cc"MM4uc23 	#NN3q6""	#   AA BA<<Bc                    V P                  4       pVP                  R R4      p\        P                  ! V4       V P	                  RRR V/4       R#   \
         d&   pT P                  \        T4      4        Rp?R# Rp?ii ; i)packager   r   TN)rs   rT   rj   adb_launch_appry   rY   r~   r[   )r   r]   r   r_   s   &   r   r/   Handler._tv_launch   si    	#??$D((9b)C%%c*MM4y#67 	#NN3q6""	#r   c                     \         P                  ! 4        V P                  R R/4       R#   \         d&   pT P	                  \        T4      4        Rp?R# Rp?ii ; i)r   TN)rj   ambilight_togglery   rY   r~   r[   )r   r_   s   & r   r0   Handler._tv_ambilight   sF    	#'')MM4,' 	#NN3q6""	#s   (, AAAc                $    V P                  4       p\        VP                  R ^ 4      4      p\        P                  ! RRVRR/4       V P                  RRR V/4       R#   \         d&   pT P                  \        T4      4        Rp?R# Rp?ii ; i)r   zaudio/volumecurrentr   Fr   TN)	rs   rR   rT   rj   js_postry   rY   r~   r[   )r   r]   volr_   s   &   r   r1   Handler._tv_volume   sy    	#??$Ddhhx+,C~	3/OPMM4x56 	#NN3q6""	#s   AA B*B

Bc                    \         P                  ! 4       pVR ,          p\         P                  ! V'       * 4       V P                  RRR V'       * /4       R#   \         d&   pT P                  \        T4      4        Rp?R# Rp?ii ; i)r   r   TN)rj   r   set_mutery   rY   r~   r[   )r   r   currently_mutedr_   s   &   r   r2   Handler._tv_mute   sj    	#..0E#GnOO 34MM4wO0CDE 	#NN3q6""	#s   AA B"BBc                |    \         P                  ! 4       pV'       d   \        P                  P	                  V4      '       d   \        VR 4      ;_uu_ 4       pVP                  4       pRRR4       V P                  ^4       V P                  RR4       V P                  R\        \        X4      4      4       V P                  4        V P                  P                  V4       R# V P                  R4       R#   + '       g   i     L; i  \         d&   pT P                  \        T4      4        Rp?R# Rp?ii ; i)rbNr>   z	image/pngrL   zScreenshot failed)rj   adb_screenshotosr   existsr@   rB   rD   r   r[   lenr   rE   rF   r~   rY   )r   r   rH   rI   r_   s   &    r   r"   Handler._tv_screenshot   s    	#,,.Dt,,$%%668D &""3'  =  !13s4y>B  "

  &23 &%  	#NN3q6""	#sA   D $D D C8)A:D %D 8D	D D;D66D;c           
         V P                  4       p\        VP                  R ^ 4      4      pV^ 8  d   \        P                  ! VR7       ^ RIpVP                  R4      ;'       g!    \        VP                  4       R,          4      p\        RR4      ;_uu_ 4       p\        P                  ! RRR VRV/V4       RRR4       M+\        P                  ! 4        \        P                  ! R4       V P                  R	RR V/4       R#   + '       g   i     L'; i    L.; i  \         d&   pT P                  \        T4      4        Rp?R# Rp?ii ; i)
	bandwidth)bandwidth_kbpsN
start_time  /share/throttle_state.jsonrM   activeTr   )rs   rR   rT   rj   throttle_applytimer@   rV   rX   throttle_remover   removery   rY   r~   r[   )r   r]   bw_timer   rH   r_   s   &      r   r3   Handler._tv_throttle   s    	#??$DTXXk1-.BAv))<$!XXl3OOs5::<$;N7O
6<<IIx{BjY[\] =< **,YY;<MM4{B78 =<
  	#NN3q6""	#sN   A$D '5D D:D D .D D	D DD E*E

Ec                b    \        \        4      ;_uu_ 4       p\        P                  ! V4      pR R R 4       V P	                  X4       R #   + '       g   i     L#; i  \
         d    T P	                  R^ /4        R # \         d&   pT P                  \        T4      4        R p?R # R p?ii ; i)Nr   )	r@   r   rV   r   ry   rC   rY   r~   r[   )r   rH   rI   r_   s   &   r   r#   Handler._tv_deficit  sw    	#m$$yy| %MM$ %$ ! 	*MM9a.) 	#NN3q6""	#s9   A AA A	A B.?B.B.	B))B.c                Z    \        \        4      ;_uu_ 4       p\        P                  ! V4      pR R R 4       Rp \        R4      ;_uu_ 4       p\        P                  ! V4      P	                  RR4      pR R R 4       TXR&   \        P                  P                  R4      '       d0   \        P                  ! \        R4      4      P	                  RT4      MTTR&   TP	                  R4      R JTR&   Rp\        P                  P                  T4      '       dN    \        T4      ;_uu_ 4       p\        P                  ! T4      pR R R 4       RTR	&   XP	                  R
4      TR&   M
RTR	&   R TR&   T P                  T4       R #   + '       g   i     EL[; i  + '       g   i     EL*; i  \
         d     EL;i ; i  + '       g   i     L; i  \        P                  \
        3 d    RTR	&   R TR&    Li ; i  \
         d&   pT P                  \        T4      4        R p?R # R p?ii ; i)N      ?"/share/.ha_cache/.ha_wd_speed.jsonspeedrecovery_speedsession_starttv_on/share/.ha_cache/.ha_wd_pausedTpaused	resume_atpause_resume_atF)r@   r   rV   r   rT   rY   r   r   r   JSONDecodeError_json_response_json_errorr[   )r   rH   stater   
pause_pathpf
pause_datar_   s   &       r   r$   Handler._sandman_status  s   	%m$$		! % E>??1 IIaL,,Wc:E @ #E'N|~  }D  }D  }K  }K  Lp  }q  }qdii5Y0Z&[&_&_`prw&x  w|E"#"YY7tCE'N9Jww~~j))4j))R%)YYr]
 *&*E(O/9~~k/JE+,
 #(h+/'(&5 %$$
 @??  *) ,,i8 4&*E(O/3E+,4  	%SV$$	%s   G: F
G: F* 'F5F* =)G: 'A0G: G ,F<!G $G: F		G: F'	!F* %G: 'F* *F95G: 8F99G: <G	G %G74G: 6G77G: :H*H%%H*c                   . p \        R4      ;_uu_ 4       pVP                  4       RR  Fq  p\        P                  ! RV4      pV'       g   K$  VP	                  RVP                  ^4      RVP                  ^4      R\        VP                  ^4      4      /4       Ks  	  RRR4       \        V4      ^d8  d   \        V4      ^d,          pVRRV1,          pT P                  RT/4       R#   + '       g   i     LS; i  \         d     L5i ; i)	z3Return deficit history points from the sandman log./share/.ha_cache/.ha_wd.logNz9(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}):\d{2}.*deficit=([\d.]+)dater   r   pointsi)
r@   	readlinesresearchappendgroupfloatr   rY   r   )r   r   rH   linemsteps   &     r   r%   Handler._sandman_history:  s    	344KKM$%0D		"^`deAqvqwwqz61771:yZ_`a`g`ghi`jZk&lm 1 5 6{S 6{c)$ 	Xv./ 54  		s/   C> 3C+AC+ 6C> +C;	6C> >DDc                   ^ RI HpHp V! V P                  4      pV! VP                  4      p\        VP                  R^.4      ^ ,          4      p. pRp \        V4      ;_uu_ 4       pVP                  4       V) R  FB  p	V	P                  4       p	V	'       g   K  VP                  \        P                  ! V	4      4       KD  	  RRR4       T'       g    \        R4      ;_uu_ 4       pTP                  4       T^,          ) R  F  p	\        P                  ! RT	4      p
T
'       g   K$  TP                  RT
P!                  ^4      RT
P!                  ^4      R	\#        T
P!                  ^4      4      R
T
P!                  ^4      RR/4       K  	  RRR4       Ye) R pT P%                  Ye) R 4       R#   + '       g   i     L; i  \         d     ELi ; i  + '       g   i     LP; i  \         d     L[i ; i)zReturn sandman + user actions from events JSONL. Accepts ?count=N (default 20).
Falls back to parsing sandman.log if events file is empty/missing.)urlparseparse_qscountz$/share/.ha_cache/.ha_wd_events.jsonlNr   zC(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}):\d{2}.*deficit=([\d.]+).*\| (\S+)r   r   r   actiontypesandman)urllib.parser   r   r   queryrR   rT   r@   r   stripr   rV   rW   rY   r   r   r   r   r   )r   r   r   parsedparamsr   actionsevents_filerH   r   r   s   &          r   r&   Handler._sandman_logK  s    	4$))$&,,'FJJw-a01<	k""aKKM5&'2D::<Dttzz$'78 3 # 788A !
mn =II&lnrs1#NNFAGGAJPQ
T]_defelelmneo_prz|}  }D  }D  EF  }G  IO  QZ  ,[  \ !> 9
 "&'* 	GFG,-% #"
  		
 98  sg   G (-F.)F.G G& ';G'A$GG& .F>	9G >G GGG#	G& &G43G4c                    \        V P                  P                  R ^ 4      4      pV'       d0   \        P                  ! V P
                  P                  V4      4      M/ p\        VP                  R^ 4      4      p\        \        4      ;_uu_ 4       p\        P                  ! V4      pRRR4       \        R\        RV4      4      XR&   \        \        R4      ;_uu_ 4       p\        P                  ! WT^R7       RRR4       V P                  RRRVR,          /4       R#   + '       g   i     L; i  + '       g   i     LA; i  \         d&   pT P!                  \#        T4      4        Rp?R# Rp?ii ; i)	rL   r   N        r   rM   rN   r   T)rR   rS   rT   rV   rW   rU   rB   r   r@   r   r   maxminrX   r   rY   r   r[   )r   r\   r]   r   rH   r   r_   s   &      r   r4   Handler._sandman_set_deficitj  s   	%))*:A>?F:@4::djjoof56bDDHHY23Gm$$		! %"3C(9:E)mS))Q		%1- *tYi8H IJ %$ *)  	%SV$$	%sH   BE D!)9E "D4;$E !D1	,E 4E	?E E7E22E7c                    \        V P                  P                  R ^ 4      4      pV'       d0   \        P                  ! V P
                  P                  V4      4      M/ pVP                  R4      pVP                  R4      p \        P                  ! \        R4      4      pVe   \        V4      VR&   Ve   \        V4      VR&   \        RR4      ;_uu_ 4       p\        P                  ! WV4       RRR4       V P                  RR/VC4       R#   \         d    / p L}i ; i  + '       g   i     L:; i  \         d&   pT P                  \        T4      4        Rp?R# Rp?ii ; i)rL   r   r   r   NrM   r   T)rR   rS   rT   rV   rW   rU   rB   r   r@   rY   r   rX   r   r   r[   )r   r\   r]   r   r   existingrH   r_   s   &       r   r5   Handler._sandman_set_speedx  s$   	%))*:A>?F:@4::djjoof56bDHHW%E!XX&67N99T*N%OP  $)%L!)-2>-B)*:C@@A		(& At 8x 89   A@  	%SV$$	%sT   B D6 D "8D6 D#1D6 D D6 D  D6 #D3	.D6 6E&E!!E&c                    ^ RI pVP                  . R
ORR^R7      pRVP                  9   pRpRp \        R4      ;_uu_ 4       p\        P
                  ! V4      pVP                  R4      pVP                  RR4      pRRR4       T P                  R	TRTRT/4       R#   + '       g   i     L); i  \         d     L9i ; i  \         d&   pT P                  \        T4      4        Rp?R# Rp?ii ; i)z)Check if tc throttle is currently active.NT)capture_outputtextre   htbr   r   r   r   r   )tcqdiscshowdevend0)
subprocessrunstdoutr@   rV   r   rT   rY   r   r~   r[   )	r   r	  rr   r   r   rH   tsr_   s	   &        r   r(   Handler._tv_throttle_status  s    	#E-1a  IAahh&FJI67711B!#!5J "{D 9I 8 6<[Zc de 87    	#NN3q6""	#s^   .C B2 :B>B2 C B/	*B2 .C /B2 2C =C ?C  C C3C..C3c                    \        R 4      ;_uu_ 4       pV P                  \        P                  ! V4      4       RRR4       R#   + '       g   i     R# ; i  \         d&   pT P                  \        T4      4        Rp?R# Rp?ii ; i)/share/.ha_cache/wd_config.jsonN)r@   r   rV   r   rY   r~   r[   )r   rH   r_   s   &  r   r'   Handler._sandman_config_get  s\    	#788A##DIIaL1 9888 	#NN3q6""	#s3   A &AA A	A A B	$BB	c                (    V P                  4       pVP                  R4      p\        R4      ;_uu_ 4       p\        P                  ! V4      pRRR4       VP                  R4      pVEe@   XP                  R/ 4      P                  R. 4      pVP                  R4      '       d   RpVP                  R	R
4      pV F:  p	V	P                  R4      '       g   K  VR,          V	R&   VR,          V	R&   WR	&   Rp M	  V'       g*   VP                  RVR,          RVR,          R	VRRRR/4       M4V U	u. uF  qP                  R4      '       d   K  V	NK  	  up	VR,          R&   \        RR4      ;_uu_ 4       p\        P                  ! WC^R7       RRR4       V P                  RRRV/4       R# VP                  R4      p
V
e   RX9  d   / VR&   RV
9   d   \        V
R,          4      VR,          R&   RV
9   d   \        V
R,          4      VR,          R&   \        RR4      ;_uu_ 4       p\        P                  ! WC^R7       RRR4       V P                  RRRVR,          /4       R# V'       Ed   VXP                  R/ 4      9   d   RV9   d$   \        VR,          4      VR,          V,          R&   RV9   d$   \        VR,          4      VR,          V,          R&   RV9   d   VR,          VR,          V,          R&   RV9   d.   VR,          V,          R,          P                  VR,          4       \        RR4      ;_uu_ 4       p\        P                  ! WC^R7       RRR4       V P                  RRRV/4       R# V P                  RR4       R#   + '       g   i     ELI; iu up	i   + '       g   i     EL$; i  + '       g   i     EL; i  + '       g   i     L|; i  \         d&   pT P                  \        T4      4        Rp?R# Rp?ii ; i)z+Update action config (min_deficit, weight).r   r  Ngolden_hoursattention_modeltime_multipliersenabledFrateg333333?
no_actionsstartendTcommentzGolden periodrM   r   r   goldenintervalmin_secondsmax_secondsr   min_deficitweightpermissible_hoursr   zUnknown action  )rs   rT   r@   rV   r   r   rX   r   rR   r   updater~   rY   r[   )r   r]   action_namerH   configr  multsfoundr  r   interval_updater_   s   &           r   r7   Handler._sandman_config_set  s   ;	#??$D((8,K788A1 9 XXn-F!

#4b9==>PRTU::i((!E!::fc2D"55..)/AgJ'-e}AeH(,fI$(E! # !gvgve}V\^bdprv  yB  DS  &T  U QVDqPU1]b]bco]pQQPUDqF,-.@A;SAAQIIf2 B##T46$BC #hhz2O*V+)+F:& O38;OM<Z8[F:&}5 O38;OM<Z8[F:&}5;SAAQIIf2 B##T4VJ=O$PQ{{fjjB.GG D(DI$}J]D^F9%k2=At#?B4>?RF9%k28<&$.JNObJcF9%k23FGt#9%k28<CCDNS;SAAQIIf2 B##T4;$GH/5m 988* ErAAA BAA BA
  	#NN3q6""	#s   4O! NAO! $-O! )O!  .O! .N!N!!O! 2N&O! *A;O! %N:>$O! $O! -CO! OO! 9O! N	O! &N7	1	O! :O		O! O	O! !P,PPc                b    \        \        4      ;_uu_ 4       p\        P                  ! V4      pRRR4       RXR&   \        \        R4      ;_uu_ 4       p\        P                  ! W!^R7       RRR4       \        RR4      ;_uu_ 4       p\        P                  ! RR/V4       RRR4       V P                  R	R
RRRR/4       R#   + '       g   i     L; i  + '       g   i     Lr; i  + '       g   i     LO; i  \         d&   pT P                  \        T4      4        Rp?R# Rp?ii ; i)z#Reset deficit to 0 and speed to 1x.Nr   r   rM   r   r   r   r   r   T)	r@   r   rV   r   rX   r   rY   r   r[   )r   rH   r   r_   s   &   r   r6   Handler._sandman_reset  s    
	%m$$		! %"E)mS))Q		%1- *:C@@A		7C.!, AtYWc JK %$ *)@@  	%SV$$	%s]   C> C%C> C.C> 
C+$C> C	C> C(	#C> +C;	6C> >D.	D))D.c           	     Z  aaa	  V P                  4       pVP                  RR4      oS'       g   V P                  RR4      #  \        R4      ;_uu_ 4       p\        P
                  ! V4      pRRR4       XP                  R/ 4      P                  S/ 4      oSR8X  dE    \        ^\        VP                  R	^4      4      4      p/ SCR
/ SP                  R
/ 4      CRV/C/Co\        P                  ! 4       o	VVV	3R lp\        P                  ! VRR7      P                  4        V P!                  RRRS/4       R#   + '       g   i     L; i  \         d    / o Li ; i  \        \        3 d    ^p Li ; i  \         d&   pT P                  \#        T4      4        Rp?R# Rp?ii ; i)z8Execute a sandman action directly on the TV for testing.r   r   zMissing actionr#  r  Nr   youtube_ad_breakn_adsr   force_n_adsc                     <  \         P                  ! SSS4       R#   \         d,    ^ RIp T P	                  R4      P                  RSRR7        R# i ; i)    Ndevices_serverztest_action %s failedT)exc_info)r   execute_actionrY   logging	getLoggerwarning)r6  r   
action_cfgtv_ips    r   
run_action0Handler._sandman_test_action.<locals>.run_action  sS    p**5&*E  p"%%&67??@WY_jn?ops    2AAT)targetdaemonr   )rs   rT   r   r@   rV   r   rY   r   rR   	TypeError
ValueErrorrj   
_get_tv_ip	threadingThreadr  r   r[   )
r   r]   rH   cfgr/  r;  r_   r   r9  r:  s
   &      @@@r   r8   Handler._sandman_test_action  s   (	%??$DXXh+F''(8#>> ;<<))A,C = WWY377C
 ++3txx';#<=E@
 @& )?:>>(B+G )?)6)?@
 ))+Ep Jt<BBDtXv >?= =<   
  ":. E$  	%SV$$	%s}   )E: E: E D;,*E E: %E! A6E: ;E	E EE: EE: !E74E: 6E77E: :F*F%%F*c           
         V P                  4       pVP                  RR4      pRpV'       d   RR/pVP                  R4      pV'       da   \        V4      ^ 8  dQ   ^ RIpVP                  P	                  4       VP                  \        V4      R7      ,           P                  4       pWtR&   \        VR4      ;_uu_ 4       p\        P                  ! WH4       RRR4       V P                  R	RRRRVP                  R4      /4       R#  \        P                  ! V4       V P                  R	RRR
/4       R#   + '       g   i     Lf; i  \         d     L7i ; i  \         d&   p	T P                  \!        T	4      4        Rp	?	R# Rp	?	ii ; i)zEToggle actions paused state. Accepts optional 'days' for timed pause.r   Tr   daysN)rG  r   rM   r   F)rs   rT   r   datetimenow	timedelta	isoformatr@   rV   rX   r   r   r   rC   rY   r   r[   )
r   r]   r   r   rI   rG  rH  r   rH   r_   s
   &         r   r9   Handler._sandman_pause   s?   	%??$DXXh-F3D $'xx'E$K!O#!)!2!2!6!6!88;M;MSXY]S^;M;_!_ j j lI(1%$__IId& %##T44dhhWbNc$deIIdO ##T45$AB %_ )   	%SV$$	%s_   +E E A4E ?D4.E E E 4E	?E EE EE F#FFc                    V P                  V4       V P                  R R4       V P                  4        V P                  P	                  \
        P                  ! V4      P                  4       4       R# rv   rD   r   r   rE   rF   rV   rZ   rG   )r   rI   rx   s   &&&r   r   Handler._json_response9  sQ    6");<

D)0023r   c                    V P                  V4       V P                  R R4       V P                  4        V P                  P	                  \
        P                  ! RV/4      P                  4       4       R# )r>   r?   rQ   NrN  r|   s   &&&r   r   Handler._json_error?  sU    6");<

WcN3::<=r   c                   ^ RI p \        RR4      ;_uu_ 4       pVP                  VP                   P                  4       P	                  R4       RW,           R24       RRR4       R#   + '       g   i     R# ; i  \
         d     R# i ; i)r2  Nz/share/devices_server.logaz%H:%M:%S 
)rH  r@   rF   rI  strftimerY   )r   formatr	   rH  rH   s   &&*  r   log_messageHandler.log_messageE  sq    	137718,,002;;JGH&-XZ[\ 8777 		s/   A= AA)A= )A:	4A= :A= =BB )   )rP   )(__name__
__module____qualname____firstlineno__r   r   r)   r;   r    r-   r   rs   ry   r~   r!   r.   r/   r0   r1   r2   r"   r3   r#   r$   r%   r&   r4   r5   r(   r'   r7   r6   r8   r9   r   r   rX  __static_attributes____classdictcell____classcell__)r   __classdict__s   @@r   r   r      s     H0!@	(E E2E.##J###### #&#%@0".>%%(#(#=#~%*%X%24> r   r   c                       ] tR tRtRtRtR# )ThreadedServeriO  TrZ  N)r\  r]  r^  r_  daemon_threadsr`  rZ  r   r   re  re  O  s    Nr   re  __main__z$Devices dashboard on http://0.0.0.0:z/panel.htmlz0.0.0.0)__doc__http.serverhttprV   r   randomr   socketserverr   rB  urllib.requestrg   tvmodrj   ha_watchdogr   rf   rA   PORTr   serverSimpleHTTPRequestHandlerr   ThreadingMixIn
HTTPServerre  r\  printserve_foreverrZ  r   r   <module>rw     s    e   	  	      	%'
4vdkk22 vr\00$++2H2H  z	0k
BCIt$g.<<> r   