ó
    &ìÌfÕ  ã                   ól   • S r SSKrSSKrSSKrSSKrSSKJr  SSKJr  SSKJ	r	J
r
  SSKr " S S5      rg)uØ  
GestiÃ³n de conexiones individuales con los medidores.

Este mÃ³dulo maneja la conexiÃ³n, comunicaciÃ³n y procesamiento de datos para cada medidor individual.

Desarrolladores:
- Para modificar el comportamiento de la conexiÃ³n, ajuste los mÃ©todos de la clase MeterConnection
- Para aÃ±adir soporte para nuevos protocolos, actualice el mÃ©todo get_protocol()
- La detecciÃ³n de anomalÃ­as se realiza en el mÃ©todo save_data(). Expanda esta lÃ³gica segÃºn sea necesario.
é    N)Údatetime)ÚIEC62056Protocol)ÚForeÚStylec                   ó<   • \ rS rSrS
S jrS rS rS rS rS r	Sr
g	)ÚMeterConnectioné   c                 óâ   • Xl         X l        X0l        X@l        SU l        SU l        U R                  U5      U l        [        R                  " SU SU 35      U l
        XPl        X`l        Xpl        g)u»  
Inicializa una conexiÃ³n de medidor.

Args:
    host (str): DirecciÃ³n IP del medidor.
    port (int): Puerto del medidor.
    mode (str): Modo de conexiÃ³n ("client" o "server").
    meter_type (str): Tipo de protocolo del medidor.
    alert_system (AlertSystem): Sistema de alertas.
    interrogation_enabled (bool): Si se debe interrogar activamente al medidor.
    interrogation_frequency (int): Frecuencia de interrogaciÃ³n en segundos.
NFzMeterConnection-Ú:)ÚhostÚportÚmodeÚ
meter_typeÚsockÚ	connectedÚget_protocolÚprotocolÚloggingÚ	getLoggerÚloggerÚalert_systemÚinterrogation_enabledÚinterrogation_frequency)Úselfr   r   r   r   r   r   r   s           Ú0/var/www/blue/EV-AMI-Back_02/meter_connection.pyÚ__init__ÚMeterConnection.__init__   sj   € ð Œ	ØŒ	ØŒ	Ø$ŒØˆŒ	ØˆŒØ×)Ñ)¨*Ó5ˆŒÜ×'Ò'Ð*:¸4¸&ÀÀ$ÀÐ(HÓIˆŒØ(ÔØ%:Ô"Ø'>Õ$ó    c                 óN   • S[        5       0nUR                  U[        5       5      $ )z>Selecciona el protocolo adecuado basado en el tipo de medidor.ÚIEC62056)r   Úget)r   r   Ú	protocolss      r   r   ÚMeterConnection.get_protocol/   s+   € ð Ô(Ó*ð
ˆ	ð �}‰}˜ZÔ)9Ó);Ó<Ð<r   c                 ó(  • U R                   (       Gd   [        R                  " [        R                  [        R                  5      U l        U R                  R                  U R                  U R                  45        U R                  R                  [        R                   SU R                   SU R                   [        R                   35        SU l         U R                  (       a-  [        R                   " U R"                  SS9R%                  5         U R                   (       d  GM  gg! [&         aZ  nU R(                  R+                  U R                  U R                  [-        U5      5        [.        R0                  " S5         SnANuSnAff = f)u&   Establece la conexiÃ³n con el medidor.zCliente conectado a r   T)ÚtargetÚdaemoné   N)r   ÚsocketÚAF_INETÚSOCK_STREAMr   Úconnectr   r   r   Úinfor   ÚGREENr   Ú	RESET_ALLr   Ú	threadingÚThreadÚinterrogate_meterÚstartÚ	Exceptionr   Úconnection_errorÚstrÚtimeÚsleep©r   Úes     r   r+   ÚMeterConnection.connect7   s  € à—.—.�.ð	Ü"ŸMšM¬&¯.©.¼&×:LÑ:LÓM�”	Ø—	‘	×!Ñ! 4§9¡9¨d¯i©iÐ"8Ô9Ø—‘× Ñ ¤D§J¡J <Ð/CÀDÇIÁIÀ;ÈaÐPT×PYÑPYÈ{Ô[`×[jÑ[jÐZkÐ!lÔmØ!%�”Ø×-×-Ü×$Ò$¨D×,BÑ,BÈ4ÑP×VÑVÔXð —.—.”.øô ó Ø×!Ñ!×2Ñ2°4·9±9¸d¿i¹iÌÈQËÔPÜ—
’
˜1—‘ûðús   ”DD- Ä-
FÄ7AFÆFc                 óh  • U R                   (       a¥   U R                  R                  S5        U R                  R	                  [
        R                   SU R                   SU R                   [        R                   35        [        R                  " U R                  5        U R                   (       a  M¤  gg! [         ao  nU R                  R!                  U R                  U R                  SU 35        SU l         U R                  R#                  5         U R%                  5          SnAN‰SnAff = f)u8   EnvÃ­a periÃ³dicamente solicitudes de estado al medidor.s   estadozEnviada solicitud de estado a r   z%Error al enviar solicitud de estado: FN)r   r   Úsendallr   r,   r   ÚCYANr   r   r   r.   r6   r7   r   r3   r   r4   Úcloser+   r8   s     r   r1   Ú!MeterConnection.interrogate_meterE   sÚ   € à�n�nðØ—	‘	×!Ñ! )Ô,Ø—‘× Ñ ¤D§I¡I ;Ð.LÈTÏYÉYÈKÐWXÐY]×YbÑYbÐXcÔdi×dsÑdsÐctÐ!uÔvÜ—
’
˜4×7Ñ7Ô8ð	 �n�n‹nøô
 ó Ø×!Ñ!×2Ñ2°4·9±9¸d¿i¹iÐKpÐqrÐpsÐItÔuØ!&�”Ø—	‘	—‘Ô!Ø—‘—‘ûð	ús   “BB8 Â8
D1ÃA%D,Ä,D1c                 óÞ  •   U R                   R                  S5      nU(       d  [        S5      eU R                  R	                  UR                  S5      5      nU R                  U5        Mk  ! [         au  nU R                  R                  U R                  U R                  [        U5      5        SU l        U R                   R                  5         U R                  5          SnAN|SnAff = f)u*   Maneja la recepciÃ³n de datos del medidor.i   u%   ConexiÃ³n cerrada por el otro extremozutf-8FN)r   Úrecvr3   r   Úprocess_messageÚdecodeÚ	save_datar   r4   r   r   r5   r   r>   r+   )r   ÚdataÚprocessed_datar9   s       r   Úhandle_connectionÚ!MeterConnection.handle_connectionR   s¯   € àð
Ø—y‘y—~‘~ dÓ+�ÞÜ#Ð$KÓLÐLØ!%§¡×!>Ñ!>¸t¿{¹{È7Ó?SÓ!T�Ø—‘˜~Ô.ñ øô ó Ø×!Ñ!×2Ñ2°4·9±9¸d¿i¹iÌÈQËÔPØ!&�”Ø—	‘	—‘Ô!Ø—‘—‘ûð	ús   ƒA(A- Á-
C,Á7A+C'Ã'C,c                 ó�  • [         R                  " 5       R                  5       n[        R                  " UU R
                   SU R                   3US.SS9n[        SS5       nUR                  US-   5        SSS5        U R                  R                  [        R                   S	U [        R                   35        S
U;   as  SUS
   ;   ai  [        US
   R!                  S5      S   R!                  S5      S   5      S:”  a2  U R"                  R%                  U R
                  U R                  S5        gggg! , (       d  f       NÆ= f)uw   
Guarda los datos procesados en un archivo y detecta anomalÃ­as.

Args:
    data (dict): Datos procesados del medidor.
r   )Ú	timestampÚmeterrE   é   )Úindentzmeter_readings.txtÚaÚ
NzDatos guardados: ÚOBISz1.8.0z1.8.0(é   Ú*r   i@B u%   Consumo de energÃ­a anormalmente alto)r   ÚnowÚ	isoformatÚjsonÚdumpsr   r   ÚopenÚwriter   r,   r   r-   r   r.   ÚfloatÚsplitr   Údata_anomaly)r   rE   rJ   Ú	json_dataÚfs        r   rD   ÚMeterConnection.save_dataa   s  € ô —L’L“N×,Ñ,Ó.ˆ	Ü—J’JØ"ØŸ	™	�{ ! D§I¡I ;Ð/Øñ 
ð ñ	ˆ	ô
 Ð&¨Ô,°Ø�G‰G�I Ñ$Ô%÷ -à�‰×ÑœDŸJ™J˜<Ð'8¸¸ÄEÇOÁOÐCTÐUÔVð �T‹>˜g¨¨f©Ó5¼%ÀÀVÁ×@RÑ@RÐS[Ó@\Ð]^Ñ@_×@eÑ@eÐfiÓ@jÐklÑ@mÓ:nÐqxÓ:xØ×Ñ×*Ñ*¨4¯9©9°d·i±iÐAhÕið ;yÐ5ˆ>÷ -Õ,ús   Á"D7Ä7
E)r   r   r   r   r   r   r   r   r   r   r   N)Fé<   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r   r+   r1   rG   rD   Ú__static_attributes__© r   r   r   r      s!   † ô?ò2=òòòõjr   r   )Ú__doc__r(   rU   r/   r6   r   r"   r   Úcoloramar   r   r   r   re   r   r   Ú<module>rh      s2   ðñ	ó Û Û Û Ý Ý &ß  Û ÷`jò `jr   