Ë
    ¾Ÿgÿ"  ã                   ó¦   — d Z ddlmZmZ ddlZddlmZ ddlmZ ddlm	Z	m
Z
mZmZ dd	lmZ dd
lmZmZ  ej$                  e«      Z G d„ de«      Zy)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                   óB   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	ˆ xZ
S )ÚRealtimeProcessorc                 ó|   •— t         ‰| �  |«       i | _        d | _        i | _        i | _        | j                  «        y )N)ÚsuperÚ__init__ÚentradasÚlast_process_timeÚperiod_measurementsÚclosed_periodsÚinitialize_entradas)ÚselfÚdb_nameÚ	__class__s     €ú>/Users/jma/desarrollo/EV-Temp_rev04/src/processors/realtime.pyr   zRealtimeProcessor.__init__   s;   ø€ Ü‰Ñ˜Ô!ØˆŒØ!%ˆÔØ#%ˆÔ Ø ˆÔØ× Ñ Õ"ó    c                 óâ  — | j                  «       syt        | j                  «      }t        j                  «       }|j                  |j                  t        z  t        z  dd¬«      }|D ]X  \  }}}t        |||«      | j                  |<   d| j                  |<   | j                  sŒ=t        j                  d|› d|d›�«       ŒZ t        j                  dt        | j                  «      › d�«       y)	uJ   
        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   z%RealtimeProcessor.initialize_entradas'   sâ   € ð ×$Ñ$Ô&Øä+¨D¯I©IÓ6ˆÜ�l‰l‹nˆð Ÿ™Ø—J‘JÔ"2Ñ2Ô6FÑFØØð %ó 
ˆð ,:ò 	kÑ'ˆI�t˜ZÜ")¨*°d¸NÓ"KˆD�M‰M˜$ÑØ-.ˆD×$Ñ$ TÑ*à�z‹zÜ—‘˜x¨ vÐ-IÈ.ÐYgÐIhÐiÕjð	kô 	�‰�n¤S¨¯©Ó%7Ð$8Ð8IÐJÕKr   c                 óò  — 	 | j                  «       syt        j                  «       }| j                  rt        j                  d|› �«       t        | j                  | j                  «      }| j                  r&t        j                  d|rt        |«      nd› d�«       |D �]  \  }}}}}|| j                  vr%| j                  rt        j                  d|› �«       Œ=| j                  |   }||j                  k\  rt| j                  r7t        j                  d|› d|j                  d	›d
|j                  d	›d|› �«       | j                  |«       |j                  |«       d| j                  |<   |j                  ||«      sŒâ| j                  j                  |d«      dz   | j                  |<   �Œ || _        | j#                  |«       y# t$        $ r$}	t        j'                  d|	› �d¬«       Y d}	~	yd}	~	ww xY w)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 r   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_idr/   ÚtempÚfechar0   ÚentradaÚes
             r   Úprocess_new_dataz"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˜D %¨Ø˜tŸ}™}Ñ,Ø—z’zÜŸ™Ð'OÐPTÈvÐ%VÔWØàŸ-™-¨Ñ-�ð ˜G×/Ñ/Ò/Ø—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Ø59×5MÑ5M×5QÑ5QÐRVÐXYÓ5ZÐ]^Ñ5^�D×,Ñ,¨TÓ2ð-_ð0 &)ˆDÔ"ð ×Ñ Õ$øäò 	OÜ�L‰LÐ:¸1¸#Ð>ÈˆL×NÑNûð	Oús$   ‚G	 “E-G	 ÆAG	 Ç		G6ÇG1Ç1G6c                 ó¸  — t        d«       t        | j                  j                  «       «      }t        d|› �«       | j                  j                  «       D ]�  \  }}| j                  j                  |d«      }|dkD  sŒ(|j                  «       }|sŒ;t        d|› d�«       t        d|› �«       t        d|d   › d	�«       t        d
|d   › d|d   › d	�«       Œƒ y)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   Útotalr/   rB   ÚcountÚstatss         r   Úshow_measurement_statusz)RealtimeProcessor.show_measurement_statuss   sâ   € ô 	Ð-Ô.Ü�D×,Ñ,×3Ñ3Ó5Ó6ˆÜÐ+¨E¨7Ð3Ô4à!Ÿ]™]×0Ñ0Ó2ò 	V‰MˆD�'Ø×,Ñ,×0Ñ0°°qÓ9ˆEØ�q‹yØ×0Ñ0Ó2�ÚÜ˜J t f¨AÐ.Ô/Ü˜N¨5¨'Ð2Ô3ÜÐ3°E¸*Ñ4EÐ3FÀcÐJÔKÜ˜L¨¨x©Ð(9¸ÀÀhÁÐ?PÐPSÐTÕUñ	Vr   c           
      ó¦  — | j                   rt        j                  d|› �«       | j                  j                  «       D ]�  \  }}||j                  k\  sŒ| j                   r4t        j                  d|› d|j
                  d›d|j                  d›�«       | j                  |«       |j                  |j                  «       d| j                  |<   Œ’ y)uA   
        Verifica y cierra perÃ­odos que hayan expirado.
        u   Verificando perÃ­odos en: õ   Cerrando perÃ­odo para entrada u    - perÃ­odo actual: r#   r2   r   N)	r(   r)   r   rO   r5   r6   r7   r8   r   )r   Úcurrent_timer/   rB   s       r   r;   z RealtimeProcessor._check_periods…   sÇ   € ð �:Š:Ü�L‰LÐ5°l°^ÐDÔEà!Ÿ]™]×0Ñ0Ó2ò 		3‰MˆD�'Ø˜w×2Ñ2Ó2Ø—:’:Ü—L‘LØ9¸$¸ð @,Ø,3×,BÑ,BÀ>Ð+RÐRUÐV]×ViÑViÐjxÐUyð{ôð ×"Ñ" 7Ô+Ø×)Ñ)¨'×*=Ñ*=Ô>Ø12�×(Ñ(¨Ò.ñ		3r   c                 ó(  — |j                  «       }|r|d   dk(  r/| j                  r"t        j                  d|j                  › �«       y| j                  rIt        j                  d|j                  › d|d   d›d	|d
   d›d|d   › d|d   › d|d   › d|d   › d�«       d}	 | j                  j                  «       }d|j                  |j                  |d   |d   |d   |d   f}d}| j                  r#t        j                  d|j                  d›�«       |j                  ||«       | j                  j                  «        | j                  r"t        j                  d|j                  › �«       |r|j                  «        yy# t        $ rl}| j                  j                  «        t        j                  d|j                  › d|› �«       | j                  rt        j                  dd¬«       Y d}~Œ„d}~ww xY w# |r|j                  «        w w xY w)u6   
        Cierra un perÃ­odo para una entrada.
        Úcantidad_medicionesr   u5   No hay estadÃ­sticas para cerrar perÃ­odo de entrada NrV   u   :
  PerÃ­odo: r6   r#   r2   r5   z
  Mediciones: z
  Promedio: rG   u   Â°C
  Min/Max: rK   rJ   rI   rH   Ú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:Tr3   )rP   r(   r)   r/   r%   Úcursorr0   r5   r6   ÚexecuteÚcommitr   Úrollbackr=   Úclose)r   rB   rS   r[   ÚregistroÚqueryrC   s          r   r7   z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,   Â"CF Æ	G9ÆA"G4Ç/G< Ç4G9Ç9G< Ç<Hc                 ó(  — t         j                  d«       d| _        | j                  r›	 | j                  j	                  «       rx	 | j                  j                  d¬«      }|j                  «        	 | j                  j                  «        	 | j                  j                  «        t         j                  d«       d| _        yy#  Y ŒXxY w#  Y ŒDxY w#  Y ŒxY w# t        $ r"}t         j                  d|› �«       Y d}~ŒDd}~ww xY w# d| _        w xY w)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_connectedr[   r_   r]   r<   r=   )r   r[   rC   s      r   ÚstopzRealtimeProcessor.stopÓ   sè   € ô 	�‰Ð1Ô2ØˆŒà�9Š9ð!Ø—9‘9×)Ñ)Ô+ðà!%§¡×!1Ñ!1¸4Ð!1Ó!@˜ØŸ™œðØŸ	™	×(Ñ(Ô*ðØŸ	™	Ÿ™Ô)ÜŸ™Ð$GÔHð !�•	ð/ øðÙûðÙûð
ÙûÜò ?Ü—‘Ð9¸!¸Ð=×>Ñ>ûð?ûð !�•	ús_   ªC Á,C Á2C Â/C ÃC	ÃC ÃCÃC ÃCÃC Ã	DÃ#D Ã;D Ä DÄD Ä	D)Ú__name__Ú
__module__Ú__qualname__r   r   rD   rT   r;   r7   rf   Ú__classcell__)r   s   @r   r   r      s+   ø„ ô#ò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   Ú	getLoggerrg   r)   r   © r   r   ú<module>rt      sJ   ðñ÷ )Û Ý !Ý ÷ó õ %ß :à	ˆ×	Ñ	˜8Ó	$€ôS!˜õ S!r   