
    7jci                        d Z ddlZddlZddlZddlZddlZddlZddlZddl	Zddl
m
Z
mZ ddlmZmZmZmZ  ed           dZdZd	d
dddZg dZdZdZdZdZdZdddZd.dededefdZdedefdZdefdZ defdZ!d e"d!ed"ed#ede#dz  f
d$Z$ G d% d&          Z% G d' d(          Z&d)Z' G d* d+          Z(d, Z)e*d-k    r e)             dS dS )/z
Blitzortung onweer verklikker
Verbindt via WebSocket met Blitzortung en toont blikseminlagen in real-time.
Stuurt alerts via eigen WebSocket server naar clients (bijv. Android app).
    N)datetimetimezone)initForeStyleBackT)	autoresetg(\I@gGz@g      &g      >@g      O@g      B@)westeastnorthsouth)zwss://ws1.blitzortung.org/zwss://ws2.blitzortung.org/zwss://ws3.blitzortung.org/zwss://ws4.blitzortung.org/zwss://ws5.blitzortung.org/i  i  i  akcoyykp6r5w66a9c2d1zbpbr5f8etuogq5u6whwz8e4d3c39t9unhwygx58,  X  )2   d   titelbericht
prioriteitc                    	 t           j                            t          t          | ||d                                          }t           j                            d|d          }t           j                            |d          5 }|j	        dk    cddd           S # 1 swxY w Y   dS # t          $ r5}t          t          j         d	| t          j                    Y d}~d
S d}~ww xY w)zAStuur Pushover notificatie (blokkerend, dus in thread aanroepen).)tokenusertitlemessagepriorityz(https://api.pushover.net/1/messages.jsonPOST)datamethod   )timeout   Nz[pushover] Fout: F)urllibparse	urlencodePUSHOVER_TOKENPUSHOVER_USERencoderequestRequesturlopenstatus	Exceptionprintr   REDr   	RESET_ALL)r   r   r   r   reqrespes          &/thuis/OnweerApp/server/blitzortung.pypushover_stuurr5   8   sE   |%%&%"'
 '
   688 	 n$$6 % 
 

 ^##C#33 	&t;#%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&   @@A@u@@AAAuuuuus<   BB+ BB+ B""B+ %B"&B+ +
C*5*C%%C*r   returnc                    t          | t                    r|                     d          } i }t          |           }|d         }|}|g}d}|}t	          dt          |                    D ]b}t          ||                   }	|	|k     r||         n|	|v r||	         n||z   }
|                    |
           |
d         }||z   ||<   |dz  }|
}cd                    |          S )z;Decomprimeer LZW-gecomprimeerde Blitzortung WebSocket data.zlatin-1r          )	
isinstancebytesdecodelistrangelenordappendjoin)r   r3   dcfresulthoinentrys              r4   
lzw_decoderM   N   s    $ &{{9%%
AT

A	!A!aqcVAQ1c!ff  !IIA!AFFAaDDAe!H1u!	Q776??    c                    d}t          j        || z
            }t          j        ||z
            }t          j        |dz            dz  t          j        t          j        |                     t          j        t          j        |                    z  t          j        |dz            dz  z  z   }|dz  t          j        t          j        |          t          j        d|z
                      z  S )u4   Berekent afstand in km tussen twee GPS-coördinaten.g     @   r9   )mathradianssincosatan2sqrt)lat1lon1lat2lon2Rdlatdlonas           r4   	haversiner_   a   s    A<t$$D<t$$D	$(		q	 8DL&&''8DL&&''(8D1H"#
#A q54:dillDIa!e,<,<====rN   c                    t          j        ||z
            }t          j        |          t          j        t          j        |                    z  }t          j        t          j        |                     t          j        t          j        |                    z  t          j        t          j        |                     t          j        t          j        |                    z  t          j        |          z  z
  }t          j        t          j        ||                    dz   dz  }g d}|t          |dz            dz           S )z6Geeft kompasrichting van (lat1,lon1) naar (lat2,lon2).ih  )NNOOZOZZWWNW-      )rQ   rR   rS   rT   degreesrU   round)	rW   rX   rY   rZ   r]   xybearing
richtingens	            r4   richtingrq   m   s    <t$$D$,t"4"4555A	$,t$$	%	%d1C1C(D(D	D8DL&&''$(4<3E3E*F*FFRVW
XA|DJq!,,--3s:G===JeGbL))A-..rN   bufferhome_lathome_lonwarn_kmc                    dt          j                     fd| D             }fd|D             }fd|D             }t          |          dk     st          |          dk     rdS d } ||          \  }}	 ||          \  }
}d}||
z
  |z  }|	|z
  |z  }t          |
|||	          |d	z  z  }t          ||	          }t          |
|          }t          ||	          }||k     }d}|rD|d
k    r>t	          ddd          D ],}|||z  z   }|	||z  z   }t          ||          |k    r|} n-dt          |d
          t          |d
          |||t          |d          t          |	d          dS )u7  
    Schat ETA op basis van centroid-beweging van twee tijdvensters.
    Alleen inslagen binnen 400 km worden meegenomen — verre buien verstoren anders het beeld.
    Venster A: 10-20 min geleden  |  Venster B: 0-10 min geleden
    Snelheid + richting → projectie → moment dat onweer warn_km bereikt.
    i  c           	      X    g | ]&}t          |d          |d                   k    $|'S latlon)r_   ).0r	LOKAAL_KMrs   rt   s     r4   
<listcomp>zbereken_eta.<locals>.<listcomp>   sF     Q Q QA8Xqx5BBiOO OOOrN   c                 2    g | ]}|d          z
  dk    |S )	server_tsr    r{   r|   nus     r4   r~   zbereken_eta.<locals>.<listcomp>   s,    BBBqb1[>&9c&A&A&A&A&ArN   c                 F    g | ]}d |d         z
  cxk     rdk    n n|S )r   r     r   r   s     r4   r~   zbereken_eta.<locals>.<listcomp>   sC    HHHqcB;,?&G&G&G&G4&G&G&G&G&G&G&G&GrN   r    Nc                     t          d | D                       t          |           z  t          d | D                       t          |           z  fS )Nc              3   &   K   | ]}|d          V  dS )ry   Nr   r{   ss     r4   	<genexpr>z0bereken_eta.<locals>.centroid.<locals>.<genexpr>   &      ..AeH......rN   c              3   &   K   | ]}|d          V  dS )rz   Nr   r   s     r4   r   z0bereken_eta.<locals>.centroid.<locals>.<genexpr>   r   rN   )sumr@   )strikess    r4   centroidzbereken_eta.<locals>.centroid   sV    ..g.....W=..g.....W=? 	?rN   r     r9   <   i0*  eta   )type
afstand_kmsnelheid_kmhrq   naderteta_scentroid_latcentroid_lon)timer@   r_   rq   r?   rl   )rr   rs   rt   ru   lokaal	venster_b	venster_ar   b_latb_lona_lata_londt_sv_latv_lonr   
afstand_nuafstand_oudrichting_strr   r   tproj_latproj_lonr}   r   s    ``                     @@r4   bereken_etar   x   s*    I	BQ Q Q Q Q Q Q Q QF CBBBFBBBIHHHHFHHHI
9~~S^^a//t? ? ? 8I&&LE58I&&LE5DU]d"EU]d"EUE5%88D4KHLXx>>JXx>>KHhu==L+F E ,""r5"%% 	 	Auqy(Huqy(H8Xx@@GKK L
 z1--|Q//%uaua	 	 	rN   c            
       J    e Zd Zdededededef
dZdedefd	Zdedefd
ZdS )Configrs   rt   
km_kritiekkm_dichtbijkm_regionaalc                 L    || _         || _        || _        || _        || _        d S Nrs   rt   r   r   r   )selfrs   rt   r   r   r   s         r4   __init__zConfig.__init__   s-      $&(rN   r   r6   c                    || j         k    r&t          j        t          j        z   t
          j        z   S || j        k    rt          j        t
          j        z   S || j        k    rt          j	        t
          j        z   S t          j
        S r   )r   r   r/   r   WHITEr   BRIGHTr   r   YELLOWCYANr   r   s     r4   alert_kleurzConfig.alert_kleur   sg    ((8dj(5<774+++8el**4,,,;--yrN   c                 T    || j         k    rdS || j        k    rdS || j        k    rdS dS )NKRITIEKDICHTBIJ	REGIONAALzver weg)r   r   r   r   s     r4   alert_labelzConfig.alert_label   s?    ((94+++:4,,,;yrN   N)	__name__
__module____qualname__floatintr   strr   r   r   rN   r4   r   r      s        ) )% ) )/2)BE) ) ) )e     e       rN   r   c                   ,    e Zd ZdefdZdefdZd ZdS )Statistiekencfgc                     || _         d| _        ddddd| _        t          d          | _        d | _        t          j                    | _        d S )Nr   )kritiekdichtbij	regionaalverinf)r   totaalper_zoner   dichtstbij_kmdichtstbij_tijdr   start)r   r   s     r4   r   zStatistieken.__init__   sJ    $%11QOO"5\\#Y[[


rN   r   c                    | xj         dz  c_         || j        j        k    r| j        dxx         dz  cc<   na|| j        j        k    r| j        dxx         dz  cc<   n;|| j        j        k    r| j        dxx         dz  cc<   n| j        dxx         dz  cc<   || j        k     r!|| _        t          j                    | _	        d S d S )Nr9   r   r   r   r   )
r   r   r   r   r   r   r   r   nowr   r   s     r4   
registreerzStatistieken.registreer   s    q,,,M)$$$)$$$$48///M*%%%*%%%%48000M+&&&!+&&&&M%   A%   ***!+D#+<>>D    +*rN   c                    t          j                     | j        z
  }| j        }t          dt          j         d            t          d|dz  dd           t          d            t          d| j                    t          d|j         d	| j        d
                     t          d|j	         d	| j        d                     t          d|j
         d| j        d                     | j        t          d          k     r3t          d| j        dd| j                            d                      t          d t          j                    d S )N
   ────────────────────────────────────────────────────────────zSAMENVATTING  (looptijd: r   .1fz min)z  Totaal inlagen   : z  Kritiek  (<zkm) : r   z  Dichtbij (<r   z  Regionaal(<zkm): r   r   z  Dichtstbij       : z km  om %H:%M:%S)r   r   r   r.   r   r   r   r   r   r   r   r   r   r   strftimer   r0   )r   looptijdr   s      r4   print_samenvattingzStatistieken.print_samenvatting   s   9;;+h(49(h(()))@(2+@@@@AAAm3dk33444NcnNNDM)4LNNOOOPcoPPT]:5NPPQQQQc.QQT];5OQQRRRe,, D$*<G D D,55jAAD D E E E,5?,,-----rN   N)r   r   r   r   r   r   r   r   r   rN   r4   r   r      sY        !F ! ! ! !2U 2 2 2 2. . . . .rN   r   z"/root/OnweerApp/server/buffer.jsonc                       e Zd ZdZddedefdZdefdZd Z	d	e
fd
Zd Zd Zd ZdefdZdededefdZdededefdZd Zd Zd Zd Zd ZdS )BlitzortungClientr   Fr   	ws_serverc                 
   || _         t          |          | _        || _        t	                      | _        t          j                    | _        i | _	        | 
                                | _        d| _        d | _        g | _        d S )Nr   )r   r   statsr   setverbonden_clientsasyncioEvent_stop_laatste_pushover_laad_buffer_buffer_laatste_eta_push_laatste_eta_batch)r   r   r   s      r4   r   zBlitzortungClient.__init__   sn    !#&&
"&)ee]__
35#'#4#4#6#6())-"$rN   r6   c                    	 ddl }|j                            t                    sg S t	          t                    5 }t          j        |          }ddd           n# 1 swxY w Y   t          j                    | j        z
  fd|D             }t          t          j         dt          |           dt          j                    |S # t          $ r6}t          t          j         d| t          j                    g cY d}~S d}~ww xY w)z8Laad buffer van schijf, filter inslagen ouder dan 1 uur.r   Nc                 H    g | ]}|                     d d          k    |S )r   r   )getr{   r|   cutoffs     r4   r~   z2BlitzortungClient._laad_buffer.<locals>.<listcomp>  s1    IIIA{A)>)>&)H)Ha)H)H)HrN   z	[buffer] z inslagen herladen van schijfz[buffer] Laden mislukt: )ospathexistsBUFFER_BESTANDopenjsonloadr   BUFFER_DUUR_Sr.   r   r   r@   r   r0   r-   r   )r   r   rF   r   geldigr3   r   s         @r4   r   zBlitzortungClient._laad_buffer  sM   	III7>>.11 	n%% $y||$ $ $ $ $ $ $ $ $ $ $ $ $ $ $Y[[4#55FIIIIIIIFTYddVddSXSbddeeeM 	 	 	T[NN!NU_NNOOOIIIIII	sF   $C C AC A!!C $A!%A%C 
D+D DDc                    	 t          t          d          5 }t          j        | j        |           ddd           dS # 1 swxY w Y   dS # t
          $ r5}t          t          j         d| t          j
                    Y d}~dS d}~ww xY w)zSla buffer op naar schijf.wNz[buffer] Opslaan mislukt: )r   r   r   dumpr   r-   r.   r   r   r   r0   )r   rF   r3   s      r4   _sla_buffer_opz BlitzortungClient._sla_buffer_op  s    	Rnc** +a	$,***+ + + + + + + + + + + + + + + + + + 	R 	R 	RT[PPAPuPPQQQQQQQQQ	Rs7   A ?A AA AA 
B*BBr   c                   K   |                     d          }|                     d          }|                     dd          }||d S t          | j        j        | j        j        ||          }t          | j        j        | j        j        ||          }t          j        |dz  t          j	                  
                                }| j                            |          }| j                            |          }	| j                            |           |                    d          }
|| j        j        k    rdnd	}t#          | | d
|
 d|	dd|dd|dd|dd|ddt$          j                    ||t)          |d          || j                            |          |
|t+          j                    d}| j                            |           t+          j                    | j        z
  fd| j        D             | _        |                     |||
           d {V  | j                            ||t)          |d          ||	|
|t+          j                    d           d S )Nry   rz   r   r   g    eA)tzr   u   ⚡   · z  z<10z6.1fz km  z<3z  (z.3fz, )r9   )ry   rz   r   rq   labeltijd	timestampr   c                 ,    g | ]}|d          k    |S r   r   r   s     r4   r~   z4BlitzortungClient.verwerk_inslag.<locals>.<listcomp>A  s'    LLLa1[>V3K3K3K3K3KrN   )r   r_   r   rs   rt   rq   r   fromtimestampr   utc
astimezoner   r   r   r   r   r   r.   r   r0   rl   r   r   rB   r   _check_pushoverr   )r   r   ry   rz   ts_nsafstandr   tskleurr	  tijdstrsymboolrecordr   s                @r4   verwerk_inslagz BlitzortungClient.verwerk_inslag  s     hhuoohhuoo##;#+FDH-tx/@#sKK 1483Dc3OO#ECKHLAAALLNN$$W--$$W--
g&&& ++j))"dh&:::%% 9 9 9' 9 9U: 9 979 9$079 989 9 89 9',9 9 	: 	: 	: s++$X))'22
 
 	F###t11LLLL4<LLL ""7L'BBBBBBBBB 	++$	
 	
 		 		 		 		 		rN   c                   K   | j                             |           |j        }t          t          j         d| t          j                    |                    t          j
        dt          | j        j        | j        j        d| j        j        | j        j        | j        j        dd                     d{V  t%          j                    }|| j        z
  fd| j        D             }|rt          t          j         dt+          |           d	| t          j                    	 t-          d
t+          |          t.                    D ]D}|||t.          z            }|                    t          j
        d|d                     d{V  En# t0          $ r Y nw xY w	 |                                 d{V  n# t0          $ r Y nw xY w| j                             |           t          t          j         d| t          j                    dS # | j                             |           t          t          j         d| t          j                    w xY w)z2Behandelt inkomende WebSocket client verbindingen.z[server] Client verbonden: 	verbondenrx   )r   r   r   )r   regiohomezones_kmNc                 ,    g | ]}|d          k    |S r  r   r   s     r4   r~   z4BlitzortungClient.client_handler.<locals>.<listcomp>g  s'    OOOan6N6N16N6N6NrN   z[server] Stuur z gebufferde inslagen naar r   batchr   r   z[server] Client verbroken: )r   addremote_addressr.   r   GREENr   r0   sendr   dumpsREGIONr   rs   rt   r   r   r   r   r   r   r@   r?   
CHUNK_SIZEr-   wait_closeddiscardr   )r   	websocketaddrr   buffer_snapshotrJ   chunkr   s          @r4   client_handlerz BlitzortungClient.client_handlerR  s     ""9---'OOOeoOOPPP nnTZ H-dh6GHH8. H0!X2 		)
 	)
 	 	 	 	 		 		 		 		 		 		 		 Y[[d((OOOOdlOOO 	TZwwO0D0Dww`dwfkfuwwxxxq#o"6"6
CC Z ZA+Aa*n,<=E#..WQV4W4W)X)XYYYYYYYYYYZ    	V'')))))))))) 	 	 	D	 "**9555T[TTTT5?TTUUUUU "**9555T[TTTT5?TTUUUUs>   ,A(F 
F"!F"&G  H 
GH GH AIc           	        K   dd l }	 |                    | j        dt                    4 d {V  t	          t
          j         dt           t          j                    | j	        
                                 d {V  d d d           d {V  d S # 1 d {V swxY w Y   d S # t          $ r8}t	          t
          j         dt           d| t          j                     d }~ww xY w)Nr   0.0.0.0z*[server] WebSocket server op ws://0.0.0.0:z[server] WebSocket poort z bezet: )
websocketsserver/  SERVER_POORTr.   r   r$  r   r0   r   waitOSErrorr/   )r   r2  r3   s      r4   start_ws_serverz!BlitzortungClient.start_ws_servery  s     	!''(;YUU ( ( ( ( ( ( ( (nn|n]b]lnnooojoo'''''''''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (  	 	 	TXbbbbabQVQ`bbccc	s;   'B$ AB>B$ 
BB$ BB$ $
C&.3C!!C&c                   	K   ddl m} ddl}ddl}ddl}|j                            |j                            t                              	 G 	fdd|           G d d|j	                  fd}|
                    |d	
          }|                                 t          t          j         dt           dt           j                    | j                                         d{V  dS )z!Serveert dashboard.html via HTTP.r   )SimpleHTTPRequestHandlerNc                   (     e Zd Z fdZd Z xZS )4BlitzortungClient.start_http_server.<locals>.Handlerc                 >     t                      j        |di| d S )N	directory)superr   )r   argskwargs	__class__dashboard_dirs      r4   r   z=BlitzortungClient.start_http_server.<locals>.Handler.__init__  s*      $J-J6JJJJJrN   c                     d S r   r   )r   fmtr?  s      r4   log_messagez@BlitzortungClient.start_http_server.<locals>.Handler.log_message  s    rN   )r   r   r   r   rE  __classcell__)rA  rB  s   @r4   Handlerr;    sS        K K K K K K      rN   rG  c                       e Zd ZdZdS )8BlitzortungClient.start_http_server.<locals>.ReuseServerTN)r   r   r   allow_reuse_addressr   rN   r4   ReuseServerrI    s        "&rN   rK  c                       dt           f          5 } |                                  d d d            d S # 1 swxY w Y   d S )Nr1  )
HTTP_POORTserve_forever)httpdrG  rK  s    r4   runz0BlitzortungClient.start_http_server.<locals>.run  s    i4g>> &%##%%%& & & & & & & & & & & & & & & & & &s   7;;T)targetdaemonz%[server] Dashboard op http://0.0.0.0:/dashboard.html)http.serverr9  socketserver	threadingr   r   dirnameabspath__file__	TCPServerThreadr   r.   r   r$  rM  r   r0   r   r5  )
r   r9  rU  rV  r   rP  threadrG  rK  rB  s
          @@@r4   start_http_serverz#BlitzortungClient.start_http_server  sX     888888			(A(ABB	 	 	 	 	 	 	. 	 	 		' 	' 	' 	' 	',0 	' 	' 	'	& 	& 	& 	& 	& 	& !!T!::nn*nn]b]lnnooojoorN   c                 |    | j         }|sdS |d         rd|d          d|d          dS d|d          d|d          dS )	z8Geeft een compacte ETA-regel voor in Pushover berichten.r:   r   z
Onweer nadert vanuit rq   u    — r    kmz
Onweer trekt weg naar )r   )r   r   s     r4   
_eta_regelzBlitzortungClient._eta_regel  sh     	2x= 	ZYS_YY3|CTYYYYV#j/VVL@QVVVVrN   r  rq   r  c           
      $  K   ddl }t          j                    }t          t                                                    D ]\  }}||k    r| j                            |d          }||z
  |k    r|| j        |<   |dk    rd}	d}
nd}	d}
d|dd	| d
| d| d	|                                 z   }t          t          j
         d|	 d| t          j                    |                    t          |	||
fd                                            dS dS )zOStuur Pushover melding als afstand binnen een zone valt en cooldown voorbij is.r   Nr   u   🚨 Onweer dichtbij!r9   u   ⚠️ Onweer in de buurtzBliksem op r   z km (z) om z
Zone: binnen r_  u   [pushover] → z: TrQ  r?  rR  )rV  r   sortedPUSHOVER_COOLDOWNitemsr   r   r`  r.   r   MAGENTAr   r0   r[  r5   r   )r   r  rq   r  rV  r   zone_kmcooldownlaatster   prior   s               r4   r  z!BlitzortungClient._check_pushover  sp     Y[[!'(9(?(?(A(A!B!B 	 	GX'!!044Wa@@<8++68D*73"}} 7 ! ; ! >WW  >  >x  >  >g  >  >18 >  >  >!%!2!2 3G T\]]%]]7]EO]]^^^$$-#Wd3# %   eggg' "	 	rN   ry   rz   c                     t           d         |cxk    ot           d         k    nc o%t           d         |cxk    ot           d         k    nc S )Nr   r   r
   r   )r'  )r   ry   rz   s      r4   in_regiozBlitzortungClient.in_regio  sZ    w39999&/9999 9v38888&.8888	:rN   c                   K   dd l }ddlm} ddd}d}| j                                        sCt
          |t          t
                    z           }|dz  }t          t          j	         d| dt          j                    	  ||d	d
d|d           4 d {V 	 }|                    t          j        ddi                     d {V  t          t          j         dt           d          dt           d          dt           d          dt           d          t          j         
           t          t          j         d            t          d           t          d t          j                    |2 3 d {V }| j                                        r n	 t%          |          }t          j        |          }	d|	v rAd|	v r=|                     |	d         |	d                   r|                     |	           d {V  # t          j        t.          f$ r Y w xY w6 	 d d d           d {V  n# 1 d {V swxY w Y   n# |j        j        $ rT}
t          t          j         d|
j         dt          j                    t9          j        d           d {V  Y d }
~
nd }
~
wt<          $ rO}
t          t          j         d|
 dt          j                    t9          j        d            d {V  Y d }
~
n^d }
~
wt.          $ rN}
t          t          j         d!|
 t          j                    t9          j        d            d {V  Y d }
~
nd }
~
ww xY w| j                                        Ad S d S )"Nr   )connectzMozilla/5.0zhttps://maps.blitzortung.org)z
User-AgentOriginr9   z[blitzortung] Verbinden met z...      
   )ping_intervalping_timeoutopen_timeoutadditional_headersproxyr^   o   z"[blitzortung] Verbonden! Filter: Wr
    Er    Nr    Sr   r   u2     TIJD      ZONE        AFSTAND   DIR  COÖRDINAATry   rz   z[blitzortung] Gesloten (z), opnieuw...r   z[blitzortung] Verbindingsfout: z, volgende server...r    z[blitzortung] Fout: ) r2  websockets.asyncio.clientrn  r   is_setBLITZORTUNG_SERVERSr@   r.   r   BLUEr   r0   r%  r   r&  r$  r'  r   rM   loadsrl  r  JSONDecodeErrorr-   
exceptionsConnectionClosedr   coder   sleepr6  r/   )r   r2  rn  headers
server_idxurlwsr   decodedr   r3   s              r4   verbind_blitzortungz%BlitzortungClient.verbind_blitzortung  s     555555 (4
 
 
*##%% +	'%j37J3K3K&KLC!OJTYUUCUUEOUUVVV''"7"$!#!#'.   ! ! ! ! ! ! ! !  ''$*c3Z"8"8999999999TZ T T&,VnT T8>vT T$WoT T17TBG/T T U U U TY222333OPPPX8u88999)+ 
! 
! 
! 
! 
! 
! 
!g:,,.. "!E!&0&9&9G#':g#6#6D$}}$#'==ed5k#J#J !D*.*=*=d*C*C$C$C$C$C$C$C$C $ 4i@ ! ! ! D! *,%! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !< (9 ' ' 'ddafddSXSbddeeemA&&&&&&&&&&&&&& ' ' 'jj!jjY^YhjjkkkmA&&&&&&&&&&&&&& ' ' 'KKqK%/KKLLLmA&&&&&&&&&&&&&&'S *##%% +	' +	' +	' +	' +	's   I CH/3H9H/A(G?>H/?HH/HH/I /
H99I <H9=I MA
J  M-AK77MAMMc                 R  K   | j                                         s	t          j        d           d{V  | j        r| j        s| j                                         \| j        g | _        fdt          dt                    t                    D             }t                      }| j        D ]H}	 |D ]}|                    |           d{V  $# t          $ r |                    |           Y Ew xY w| xj        |z  c_        | j                                         dS dS )uG   Stuurt gebatchte inslagen elke 500ms als één JSON-array naar clients.g      ?Nc           	      ^    g | ])}t          j        d ||t          z            d          *S )r   r!  )r   r&  r(  )r{   rJ   r   s     r4   r~   z1BlitzortungClient.batch_flush.<locals>.<listcomp>  sI        
GaJ>N8OPPQQ  rN   r   )r   r}  r   r  r   r   clearr?   r@   r(  r   r%  r-   r"  )r   	berichtenweggestuurdclientr   r   s        @r4   batch_flushzBlitzortungClient.batch_flush  s     *##%% 	2-$$$$$$$$$; d&< !!###KEDK   q#e**j99  I %%K0 , ,,#, 3 3$kk'22222222223  , , ,OOF+++++,""k1""% *##%% 	2 	2 	2 	2 	2s   5 CC87C8c                   K   ddl }d}d}| j                                        st          j        d           d{V  t          | j        | j        j        | j        j	        | j        j
                  }|l|                                  |d         |k    r|nd| _        |d         |k    rt          j        ddd	          }t                      }| j        D ]C}	 |                    |           d{V  # t$          $ r |                    |           Y @w xY w| xj        |z  c_        #|d
         rY|d         rQ|d         dz  }t)          t*          j         d|d          d|d          d|d          d| dt.          j                    t3          j                    }	|d
         r|	| j        z
  |k    rz|	| _        d}
d|d          d|d          d}t)          t*          j         d| t.          j                    |                    t:          |
|dfd                                           | j        s0t          j        |          }t                      }| j        D ]C}	 |                    |           d{V  # t$          $ r |                    |           Y @w xY w| xj        |z  c_        | j                                        dS dS )zDBerekent elke minuut ETA, stuurt naar clients en optioneel Pushover.r   Nr   r"   r   r   r   T)r   verbergr   r   z[eta] Onweer nadert vanuit rq   z op u    km · r   u    km/h · ETA z minu   🌩 Onweer updatezOnweer nadert vanuit z

Afstand: r_  z[pushover] ETA update: rb  )rV  r   r}  r   r  r   r   r   rs   rt   r   r  r   r   r&  r   r   r%  r-   r"  r.   r   r   r   r0   r   r   rf  r[  r5   r   )r   rV  ETA_PUSH_COOLDOWNETA_ZICHTBAAR_KMr   
bericht_wsr  r  minutenr   r   r   s               r4   eta_broadcastzBlitzortungClient.eta_broadcast  s     #*##%% >	2-#########!!#	 C { !!! (+<'8<L'L'LRVD < #333!Z4(H(HII
!ee"4 0 0F0$kk*5555555555$ 0 0 0#/////0&&+5&& 8} @W @g,", ? ?Z ? ?-? ?69.6I? ? '? ?-2_? ? @ @ @
 BH T337HHH)+&.>3z? > >'*<'8> > >XXgXuXXYYY  )!, !   %''' ) CJ%%K0 , ,, ++j1111111111  , , ,OOF+++++,""k1""} *##%% >	2 >	2 >	2 >	2 >	2s$   C77DD'JJ%$J%c                 8    | j                                          d S r   )r   r   r   s    r4   stopzBlitzortungClient.stopX  s    
rN   c                    K                                                                                                       g} j        rN|                                                                |                                                                t          j                    } fd}t          j
        t          j        fD ]}|                    ||           t          j        |ddi d {V }|D ]A}t          |t                    r*t!          t"          j         d| t&          j                    B                                   j                                         d S )Nc                      t          dt          j         dt          j                                                      d S )Nr   z
Stoppen...)r.   r   r   r   r0   r  r  s   r4   handle_signalz,BlitzortungClient.run.<locals>.handle_signalc  s7    ?t{??eo??@@@IIKKKKKrN   return_exceptionsTz[fout] )r  r  r  r   rB   r7  r]  r   get_running_loopsignalSIGINTSIGTERMadd_signal_handlergatherr;   r-   r.   r   r/   r   r0   r  r   r   )r   takenloopr  sigresultsr|   s   `      r4   rP  zBlitzortungClient.run[  ss     ))++T-?-?-A-A4CSCSCUCUV> 	3LL--//000LL//11222'))	 	 	 	 	 M6>2 	8 	8C##C7777FFFFFFFFF 	@ 	@A!Y'' @>>!>U_>>???
%%'''''rN   N)F)r   r   r   r   r   boolr   r>   r   r  dictr  r/  r7  r]  r   r`  r   r  rl  r  r  r  r  rP  r   rN   r4   r   r      s|       M
% 
%F 
%t 
% 
% 
% 
%d     R R R2 2 2 2 2h%V %V %VN       8WC W W W WU c C    4:E : :$ : : : :4' 4' 4'l2 2 2,D2 D2 D2L  ( ( ( ( (rN   r   c                     t          j        dt           j        d          } |                     dddt                      |                     dt
          t          d	t           d
           |                     dt
          t          dt           d
           |                     dt          dd           |                     dt          dd           |                     dt          dd           | 	                                }t          |j        |j        |j        |j        |j                  }t!          t"          j         d            t!          d           t!          d|j        dd|j        dd           t!          dt*          d          d t*          d!          d"t*          d#          d$t*          d%                     t!          d&|j         d'|j         d(|j         d)           |j        r/t!          d*t                      t!          d+t4           d,           t!          d t6          j         d-           t;          ||j        .          }t=          j        |                                           d S )/NzBlitzortung onweer verklikkera>  
Voorbeelden:
  python3 blitzortung.py                      # alleen terminal output
  python3 blitzortung.py --server             # + WebSocket server op poort 8095
  python3 blitzortung.py --lat 52.37 --lon 4.90  # Amsterdam als thuislocatie
  python3 blitzortung.py --kritiek 20         # alert bij < 20 km
        )descriptionformatter_classepilogz--server
store_truez Start WebSocket server op poort )actionhelpz--latz"Thuislocatie latitude (standaard: r  )r   defaultr  z--lonz#Thuislocatie longitude (standaard: z	--kritiekr   z&Kritieke afstand in km (standaard: 50)z
--dichtbijr   z'Dichtbij afstand in km (standaard: 100)z--regionaalr   z(Regionaal afstand in km (standaard: 300)r   u   ════════════════════════════════════════════════════════════z  BLITZORTUNG ONWEER VERKLIKKERz  Thuislocatie : z.4fu   °N, u   °Ez  Regio filter : Wr
   ry  r   rz  r   r{  r   z  Zones        : kritiek <zkm  dichtbij <zkm  regionaal <kmz  WS server    : ws://0.0.0.0:z   Dashboard    : http://0.0.0.0:rS  r   )r   ) argparseArgumentParserRawDescriptionHelpFormatteradd_argumentr4  r   DEFAULT_HOME_LATDEFAULT_HOME_LONr   
parse_argsr   ry   rz   r   r   r   r.   r   r   rs   rt   r'  r   r   r   serverrM  r   r0   r   r   rP  )parserr?  r   r  s       r4   mainr  r  s   $3 <
 
 
F 
<NNN  P P P
e5EUBRUUU  W W W
e5EVCSVVV  X X X
CE  G G G
CF  H H H
CG  I I ID
<M^  C 
TY
"
"
"###	
,---	
Jcl
J
J
JS\
J
J
J
JKKK	 3vf~ 3 3 3 3Wo3 3!'3 3 4 4 4	 -s~ - -- -(- - - . . . { N=|==>>>LLLLMMM	X
*u
*
*
*+++sdk:::FK

rN   __main__)r   )+__doc__r   r   rQ   r   r  r  urllib.requestr#   urllib.parser   r   coloramar   r   r   r   r  r  r'  r~  r4  r(  rM  r&   r'   rd  r   r   r5   rM   r   r_   rq   r>   r  r   r   r   r   r   r  r   r   rN   r4   <module>r     s                  ' ' ' ' ' ' ' ' , , , , , , , , , , , , t        	
 
    

 21 
	   #      ,S S    &	> 	> 	> 	> 	>/ / / / /6 6 6 6 6SWZ^S^ 6 6 6 6r       8$. $. $. $. $. $. $. $.N 6x( x( x( x( x( x( x( x(v0 0 0f zDFFFFF rN   