
    "j/                    $   S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SK	J
r
Jr  S SKJr  S SKJr  \R                   R#                  SS5      r\" \R                   R#                  SS	5      5      rS
r\" \5      R/                  5       R0                  r\" \R                   R#                  S\S-  5      5      rSrSS jr\" 5       r\4SS jjrSS jrSS jr SS jr!\!\\S.           SS jjr" " S S\
5      r#SS jr$\%S:X  a  \$" 5         gg)     )annotationsN)SimpleHTTPRequestHandlerThreadingHTTPServer)Path)CallableHOSTz0.0.0.0PORT8787ATEPEX_CACHE_DIRepex_price_cachez$https://api.awattar.at/v1/marketdatac                 B   [        [        R                  R                  SS5      5      [        [        [
        R                  5      [        [
        R                  5      S-  [        S5      /n U  H(  nU(       d  M  US-  R                  5       (       d  M&  Us  $    [        $ )NSTATIC_ROOT localz/appzenergy_spot_dashboard.html)r   osenvirongetROOTsysprefixexists)
candidates	candidates     /app/energy_dashboard_server.pyresolve_static_rootr      sy    RZZ^^M2./SZZSZZ7"VJ  	9)&BBJJLL   K    c                     U SU SU SU S3-  $ )Nepex__z.csv )	cache_dirstartendbzns       r   
cache_pathr&   '   s"    se1UG1SE666r   c           
     B   U R                  SSS9 n/ n[        R                  " U5       HU  nUR                  [	        US   5      [	        US   5      [        US   5      UR                  S5      =(       d    SS	.5        MW     S S S 5        S
WS.$ ! , (       d  f       N= f)Nr   utf-8newlineencodingstart_timestampend_timestampmarketpriceunitEur/MWhr,   r-   r.   r/   list)objectdata)opencsv
DictReaderappendintfloatr   )pathfrowsrows       r   
read_cacher?   +   s    	2	0A>>!$CKK'*3/@+A'B%(_)=%>#(]);#<GGFO8y	 % 
1 d++ 
1	0s   A2B
Bc           
        U R                   R                  SSS9  UR                  S5      =(       d    / nU R                  SSSS9 n[        R
                  " U/ SQS	9nUR                  5         U HU  nUR                  [        US
   5      [        US   5      [        US   5      UR                  S5      =(       d    SS.5        MW     S S S 5        g ! , (       d  f       g = f)NTparentsexist_okr4   wr   r(   r)   r1   )
fieldnamesr,   r-   r.   r/   r0   )
parentmkdirr   r5   r6   
DictWriterwriteheaderwriterowr9   r:   )r;   payloadr4   r<   writerr>   s         r   write_cacherM   :   s    KKdT2;;v$"D	3W	5R
 	COO'*3/@+A'B%(_)=%>#(]);#<GGFO8y	  
6	5	5s   BC
C c                    [         R                  R                  U SS9 n[        R                  " UR                  5       R                  S5      5      sS S S 5        $ ! , (       d  f       g = f)N   )timeoutr(   )urllibrequesturlopenjsonloadsreaddecode)urlresponses     r   fetch_awattar_jsonrZ   N   sD    			R		0Hzz(--/009: 
1	0	0s   3A
A*)
fetch_jsonr"   r%   c                  [        X0X5      nUR                  5       (       a  [        U5      S[        U5      S.4$ [        R
                  R                  XS.5      nU" [         SU 35      n[        XW5        US[        U5      S.4$ )NT)cacheHitr;   )r#   r$   ?F)	r&   r   r?   strrQ   parse	urlencodeAWATTAR_URLrM   )r#   r$   r[   r"   r%   r;   queryrK   s           r   
get_pricesrd   S   s|     i1D{{}}$dCI!FFFLL""U#?@EK=%12GD	:::r   c                  B   ^  \ rS rSrU 4S jrSU 4S jjrSS jrSrU =r$ )DashboardHandlere   c                D   > [         TU ]  " US[        [        5      0UD6  g )N	directory)super__init__r_   r   )selfargskwargs	__class__s      r   rk   DashboardHandler.__init__f   s    $E#k*:EfEr   c                   > [         R                  R                  U R                  5      nUR                  S:X  a  U R	                  U5        g [
        TU ]  5         g )Nz	/api/epex)rQ   r`   urlparser;   handle_epexrj   do_GET)rl   parsedro   s     r   rt   DashboardHandler.do_GETi   sB    &&tyy1;;+%V$r   c                   [         R                  R                  UR                  5      n [	        UR                  SS/5      S   5      n[	        UR                  SS/5      S   5      nX4:  a  [        S5      e[        X45      u  pV[        R                  " SUS   US.5      R                  S	5      nU R                  S
5        U R                  SS5        U R                  S[        [        U5      5      5        U R                  SS5        U R!                  5         U R"                  R%                  U5        g ! [         aK  n[        R                  " S[        U5      05      R                  S	5      nU R                  S5         S nANS nAff = f)Nr#   r   r   r$   zstart must be before endr2   r4   )r3   r4   cacher(      errori  zContent-Typezapplication/json; charset=utf-8zContent-LengthzCache-Controlzno-store)rQ   r`   parse_qsrc   r9   r   
ValueErrorrd   rT   dumpsencodesend_response	Exceptionr_   send_headerlenend_headerswfilewrite)	rl   ru   paramsr#   r$   rK   metabodyexcs	            r   rs   DashboardHandler.handle_epexp   sG   &&v||4
	$

7RD1!45Efjj-a01C| !;<<&u2MG::SWXY``ahiDs#
 	)JK)3s4y>:*5

  	$::wC1299'BDs##	$s   BD7 7
FAFFr!   returnNone)ru   zurllib.parse.ParseResultr   r   )	__name__
__module____qualname____firstlineno__rk   rt   rs   __static_attributes____classcell__)ro   s   @r   rf   rf   e   s    F r   rf   c                     [         R                  SSS9  [        [        [        4[
        5      n [        S[         S[         S35        [        S[         35        [        S[          35        U R                  5         g )NTrA   z#Serving energy dashboard on http://:z/energy_spot_dashboard.htmlzStatic files: zEPEX CSV cache: )		CACHE_DIRrG   r   r   r	   rf   printr   serve_forever)servers    r   mainr      sg    OOD4O0 $/?@F	/vQtf<W
XY	N;-
()	YK
()
r   __main__)r   r   )
r"   r   r#   r9   r$   r9   r%   r_   r   r   )r;   r   r   dict)r;   r   rK   r   r   r   )rX   r_   r   r   )r#   r9   r$   r9   r[   zCallable[[str], dict]r"   r   r%   r_   r   ztuple[dict, dict]r   )&
__future__r   r6   rT   r   r   urllib.parserQ   urllib.requesthttp.serverr   r   pathlibr   typingr   r   r   r   r9   r	   BZN__file__resolverF   r   r   rb   r   r   r&   r?   rM   rZ   rd   rf   r   r   r!   r   r   <module>r      s-   " 
  	 
   E   
zz~~fi(
2::>>&&)*
H~&& 0$9K2KLM	4 "# BE 7,(; );;;	; &	;
 ; 
; ;$/ @ zF r   