ó
    ¤¥g#  ã                   ó¦   • S r SSKJrJr  SSKrSSKJr  SSK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  \R$                  " \5      r " S S\5      rg)uV  
Procesador de datos en tiempo real - MVP v1.0

Gestiona el procesamiento continuo de nuevas mediciones,
manteniendo estadÃ­sticas actualizadas por perÃ­odos de 15 minutos.

Este mÃ³dulo implementa:
- Monitoreo continuo de nuevas mediciones
- Procesamiento en perÃ­odos de 15 minutos
- GestiÃ³n de perÃ­odos incompletos
- Control de timeouts
é    )ÚdatetimeÚ	timedeltaN)ÚErroré   )ÚBaseProcessoré   )Úget_unprocessed_measurementsÚget_active_sensorsÚmark_as_processed_batchÚinsert_registros_batch)ÚEntrada)ÚPROCESS_INTERVALÚ
BATCH_SIZEc                   óL   ^ • \ rS rSrU 4S jrS rS rS rS rS r	S r
S	rU =r$ )
ÚRealtimeProcessoré   c                 ó|   >• [         TU ]  U5        0 U l        S U l        0 U l        0 U l        U R                  5         g )N)ÚsuperÚ__init__ÚentradasÚlast_process_timeÚperiod_measurementsÚclosed_periodsÚinitialize_entradas)ÚselfÚdb_nameÚ	__class__s     €Ú?/var/www/blue/EV-Temp_rev04/src/processors/realtime/realtime.pyr   ÚRealtimeProcessor.__init__   s;   ø€ Ü‰Ñ˜Ô!ØˆŒØ!%ˆÔØ#%ˆÔ Ø ˆÔØ× Ñ Õ"ó    c                 óô  • U R                  5       (       d  g[        U R                  5      n[        R                  " 5       nUR                  UR                  [        -  [        -  SSS9nU H]  u  pEn[        XeU5      U R                  U'   SU R                  U'   U R                  (       d  MA  [        R                  SU SUS 35        M_     [        R                  S[        U R                  5       S35        g)	u:   
Inicializa las entradas activas para el perÃ­odo actual.
Nr   )ÚminuteÚsecondÚmicrosecondzEntrada u    inicializada para perÃ­odo ú%Y-%m-%d %H:%MzInicializadas z entradas activas)Úcheck_connectionr
   Úconnr   ÚnowÚreplacer"   r   r   r   r   ÚdebugÚloggerÚinfoÚlen)r   Úactive_sensorsr(   Úperiodo_actualÚ	sensor_idÚdmacÚ
id_entradas          r   r   Ú%RealtimeProcessor.initialize_entradas'   sÜ   € ð ×$Ñ$×&Ñ&Øä+¨D¯I©IÓ6ˆÜ�lŠl‹nˆð Ÿ™Ø—J‘JÔ"2Ñ2Ô6FÑFØØð %ð 
ˆó ,:Ñ'ˆI˜ZÜ")¨*¸NÓ"KˆD�M‰M˜$ÑØ-.ˆD×$Ñ$ TÑ*à�z�z‰zÜ—‘˜x¨ vÐ-IÈ.ÐYgÐIhÐiÖjñ ,:ô 	�‰�n¤S¨¯©Ó%7Ð$8Ð8IÐJÕKr    c                 ó8  •  U R                  5       (       d  g[        R                  " 5       nU R                  (       a  [        R                  SU 35        [        U R                  U R                  5      nU R                  (       a+  [        R                  SU(       a  [        U5      OS S35        U GH  u  p4pVnX@R                  ;  a+  U R                  (       a  [        R                  SU 35        MB  U R                  U   nXhR                  :¼  ay  U R                  (       a7  [        R                  SU SUR                  S	 S
UR                  S	 SU 35        U R                  U5        UR                  U5        SU R                  U'   UR                  XV5      (       d  Mñ  U R                  R                  US5      S-   U R                  U'   GM      Xl        U R#                  U5        g! [$         a!  n	[        R'                  SU	 3SS9   Sn	A	gSn	A	ff = f)z/
Procesa las nuevas mediciones en tiempo real.
NzIniciando process_new_data en z
Obtenidas r   z mediciones sin procesaru(   MediciÃ³n para entrada no inicializada: u   Nueva mediciÃ³n u    fuera del perÃ­odo actual (r%   ú - z) para entrada é   zError procesando nuevos datos: T©Úexc_info)r&   r   r(   r*   r+   r	   r'   r-   r   Úperiodo_finÚperiodo_inicioÚ_close_periodÚreiniciar_periodor   Úagregar_medicionÚgetr   Ú_check_periodsÚ	ExceptionÚerror)
r   r(   ÚmeasurementsÚm_idr1   ÚtempÚfechar2   ÚentradaÚes
             r   Úprocess_new_dataÚ"RealtimeProcessor.process_new_dataA   sÑ  € ð,	OØ×(Ñ(×*Ñ*Øä—,’,“.ˆCØ�z�zÜ—‘Ð=¸c¸UÐCÔDä7¸¿	¹	À4Ç:Á:ÓNˆLà�z�zÜ—‘˜z¾|¬#¨lÔ*;ÐQRÐ)SÐSkÐlÔmô 8DÑ3�˜D¨ØŸ}™}Ó,Ø—z—zÜŸ™Ð'OÐPTÈvÐ%VÔWÙàŸ-™-¨Ñ-�ð ×/Ñ/Ó/Ø—z—zÜŸ™Ø.¨u¨gð 6 Ø '× 6Ñ 6°~ÐFÀcÈ'×J]ÑJ]Ð^lÐImð n,Ø,0¨6ð3ôð
 ×&Ñ& wÔ/Ø×-Ñ-¨eÔ4Ø56�D×,Ñ,¨TÑ2ð ×+Ñ+¨D×8Ó8Ø59×5MÑ5M×5QÑ5QÐRVÐXYÓ5ZÐ]^Ñ5^�D×,Ñ,¨TÔ2ñ- 8Dð0 &)Ô"ð ×Ñ Õ$øäó 	OÜ�L‰LÐ:¸1¸#Ð>ÈˆLÖNûð	Oús$   ‚G. ˜F	G. Æ%AG. Ç.
HÇ8HÈHc                 óÊ  • [        S5        [        U R                  R                  5       5      n[        SU 35        U R                  R                  5        H‰  u  p#U R                  R                  US5      nUS:”  d  M)  UR                  5       nU(       d  MB  [        SU S35        [        SU 35        [        SUS    S	35        [        S
US    SUS    S	35        M‹     g)z-
Muestra el estado actual de las mediciones.
z
=== Mediciones Actuales ===u   Total mediciones perÃ­odo: r   z	
Entrada Ú:z  Mediciones: u     Ãšltima temperatura: Úpromedioõ   Â°Cu     MÃ¡x/Min: Úmaximoõ   Â°C / ÚminimoN)ÚprintÚsumr   Úvaluesr   Úitemsr>   Úget_estadisticas)r   Útotalr1   rF   ÚcountÚstatss         r   Úshow_measurement_statusÚ)RealtimeProcessor.show_measurement_statuss   sÛ   € ô 	Ð-Ô.Ü�D×,Ñ,×3Ñ3Ó5Ó6ˆÜÐ+¨E¨7Ð3Ô4à!Ÿ]™]×0Ñ0Ö2‰MˆDØ×,Ñ,×0Ñ0°°qÓ9ˆEØ�q�yØ×0Ñ0Ó2�ß�5Ü˜J t f¨AÐ.Ô/Ü˜N¨5¨'Ð2Ô3ÜÐ3°E¸*Ñ4EÐ3FÀcÐJÔKÜ˜L¨¨x©Ð(9¸ÀÀhÁÐ?PÐPSÐTÖUò 3r    c           
      ó¾  • U R                   (       a  [        R                  SU 35        U R                  R                  5        H–  u  p#XR                  :¼  d  M  U R                   (       a4  [        R                  SU SUR
                  S SUR                  S 35        U R                  U5        UR                  UR                  5        SU R                  U'   M˜     g)u1   
Verifica y cierra perÃ­odos que hayan expirado.
u   Verificando perÃ­odos en: õ   Cerrando perÃ­odo para entrada u    - perÃ­odo actual: r%   r5   r   N)	r*   r+   r   rT   r9   r:   r;   r<   r   )r   Úcurrent_timer1   rF   s       r   r?   Ú RealtimeProcessor._check_periods…   s¾   € ð �:�:Ü�L‰LÐ5°l°^ÐDÔEà!Ÿ]™]×0Ñ0Ö2‰MˆDØ×2Ñ2Õ2Ø—:—:Ü—L‘LØ9¸$¸ð @,Ø,3×,BÑ,BÀ>Ð+RÐRUÐV]×ViÑViÐjxÐUyð{ôð ×"Ñ" 7Ô+Ø×)Ñ)¨'×*=Ñ*=Ô>Ø12�×(Ñ(¨Ó.ò 3r    c                 ót  • UR                  5       nU(       a	  US   S:X  a4  U R                  (       a"  [        R                  SUR                   35        gU R                  (       aI  [        R                  SUR                   SUS   S S	US
   S SUS    SUS    SUS    SUS    S35        Sn U R                  R                  5       nSUR                  UR                  US   US   US   US   4nSnU R                  (       a#  [        R                  SUR                  S 35        UR                  XT5        U R                  R                  5         U R                  (       a"  [        R                  SUR                   35        U(       a  UR                  5         gg! [         an  nU R                  R                  5         [        R                  SUR                   SU 35        U R                  (       a  [        R                  SSS9   SnANŒSnAff = f! U(       a  UR                  5         f f = f)u&   
Cierra un perÃ­odo para una entrada.
Úcantidad_medicionesr   u5   No hay estadÃ­sticas para cerrar perÃ­odo de entrada Nr\   u   :
  PerÃ­odo: r:   r%   r5   r9   z
  Mediciones: z
  Promedio: rL   u   Â°C
  Min/Max: rP   rO   rN   rM   ÚdesviozÅ
            INSERT IGNORE INTO registros 
                (idSistema, idEntrada, fecha, medio, maximo, minimo, desvio)
            VALUES 
                (%s, %s, %s, %s, %s, %s, %s)
            u   Ejecutando query para perÃ­odo z-Registro insertado exitosamente para entrada z'Error insertando registro para entrada z: zError detallado:Tr7   )rU   r*   r+   r1   r'   Úcursorr2   r9   r:   ÚexecuteÚcommitr   ÚrollbackrA   Úclose)r   rF   rX   rb   ÚregistroÚqueryrG   s          r   r;   ÚRealtimeProcessor._close_period—   s  € ð ×(Ñ(Ó*ˆÞ˜Ð3Ñ4¸Ó9Ø�z�zÜ—‘ÐTÐU\×UaÑUaÐTbÐcÔdØà�:�:Ü�L‰LØ1°'·,±,°ð @Ø$Ð%5Ñ6°~ÐFÀcÈ%ÐP]ÑJ^Ð_mÐInð o!Ø!&Ð'<Ñ!=Ð >ð ?Ø$ ZÑ0Ð1ð 2Ø# H™oÐ.¨f°U¸8±_Ð4EÀSð	Jôð ˆð%	Ø—Y‘Y×%Ñ%Ó'ˆFð Ø×"Ñ"Ø×#Ñ#Ø�jÑ!Ø�h‘Ø�h‘Ø�h‘ðˆHðˆEð �z�zÜ—‘Ð>¸w×?UÑ?UÐVdÐ>eÐfÔgà�N‰N˜5Ô+Ø�I‰I×ÑÔà�z�zÜ—‘ÐLÈWÏ\É\ÈNÐ[Ô\ö Ø—‘•ð øô ó 	@Ø�I‰I×ÑÔ Ü�L‰LÐBÀ7Ç<Á<À.ÐPRÐSTÐRUÐVÔWØ�z�zÜ—‘Ð/¸$�Ñ?ÿøð		@ûö Ø—‘•ð ús,   Â2CF" Æ"
HÆ,A$HÈH ÈHÈH ÈH7c                 ó<  • [         R                  S5        SU l        U R                  (       aŸ   U R                  R	                  5       (       av   U R                  R                  SS9nUR                  5          U R                  R                  5          U R                  R                  5         [         R                  S5        O SU l        gg!    NZ= f!    NF= f!    N= f! [         a"  n[         R                  SU 35         SnANESnAff = f! SU l        f = f)z*
Detiene el procesador y limpia recursos.
zDeteniendo el procesador...FT)Úbufferedu!   ConexiÃ³n a base de datos cerradau   Error cerrando conexiÃ³n: N)
r+   r,   Úrunningr'   Úis_connectedrb   rf   rd   r@   rA   )r   rb   rG   s      r   ÚstopÚRealtimeProcessor.stopÓ   sð   € ô 	�‰Ð1Ô2ØˆŒà�9�9ð!Ø—9‘9×)Ñ)×+Ñ+ðà!%§¡×!1Ñ!1¸4Ð!1Ð!@˜ØŸ™œðØŸ	™	×(Ñ(Ô*ðØŸ	™	Ÿ™Ô)ÜŸ™Ð$GÕHð ,ð* !�•	ð/ øðÙûðÙûð
ÙûÜó ?Ü—‘Ð9¸!¸Ð=×>Ñ>ûð?ûð !�•	úsq   ¯C# Á)C Á9C Â/C ÃD ÃCÃC# ÃCÃC# ÃC ÃC# ÃD Ã C# Ã#
DÃ-D
ÄD Ä
DÄD Ä	D)r   r'   r   r   r   rl   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r   rH   rY   r?   r;   rn   Ú__static_attributes__Ú__classcell__)r   s   @r   r   r      s0   ø† õ#òLò40OòdVò$3ò$9÷x!ð !r    r   )Ú__doc__r   r   ÚloggingÚmysql.connectorr   Úbaser   Údb.databaser	   r
   r   r   Úmodels.entradar   Úconfig.settingsr   r   Ú	getLoggerrp   r+   r   © r    r   Ú<module>r      sH   ðñ÷ )Û Ý !Ý  ÷ó õ &ß ;à	×	Ò	˜8Ó	$€ôS!˜õ S!r    