ó
    �v£g7  ã                   ó¶   • S r SSKJrJ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  SS	KJrJrJrJrJrJrJr  \R*                  " \5      r " S
 S\5      rg)u÷   
Procesador de desvÃ­os - MVP v1.0

Analiza las mediciones en tiempo real para detectar desvÃ­os 
y generar alarmas cuando los valores exceden los lÃ­mites configurados.
Este procesador es independiente del sistema de promediaciÃ³n por perÃ­odos.
é    )ÚdatetimeÚ	timedeltaN)ÚDictÚTuple)Údefaultdicté   )ÚBaseProcessoré   )ÚSTATE_NORMALÚSTATE_ABOVE_MAXÚSTATE_ALARM_MAXÚSTATE_BELOW_MINÚSTATE_ALARM_MINÚDEVIATION_BATCH_SIZEÚ DEVIATION_CONFIG_UPDATE_INTERVALc                   óp   ^ • \ 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 4S
 jrS rS rS rSrU =r$ )ÚDeviationProcessoré   c                 óF  >• [         TU ]  U5        [        U R                  5      U l        [        [
        5      U l        / U l        [        R                  " 5       U l
        [        U l        S U l        [        U l        [         R#                  S5        U R%                  5         g )NzDeviationProcessor inicializado)ÚsuperÚ__init__r   Ú_create_default_stateÚdeviation_statesÚdictÚconfigsÚbatch_alarmsÚ	threadingÚLockÚ
alarm_lockr   Ú
batch_sizeÚlast_config_updater   Úconfig_update_intervalÚloggerÚinfoÚload_configurations)ÚselfÚdb_nameÚ	__class__s     €Ú7/var/www/blue/EV-Temp_rev04/src/processors/deviation.pyr   ÚDeviationProcessor.__init__   su   ø€ Ü‰Ñ˜Ô!Ü +¨D×,FÑ,FÓ GˆÔÜ"¤4Ó(ˆŒØˆÔÜ#Ÿ.š.Ó*ˆŒÜ.ˆŒØ"&ˆÔÜ&FˆÔ#Ü�‰Ð5Ô6Ø× Ñ Õ"ó    c                 ó   • [         SSS.$ )z Factory para estados por defectoN)Ústate_idÚ
start_timeÚ
last_value)r   )r&   s    r)   r   Ú(DeviationProcessor._create_default_state)   s   € ô %ØØñ
ð 	
r+   c                 óX  • [         R                  " 5       nU R                  b+  XR                  -
  R                  5       U R                  :”  Ga   U R                  5       (       d6  [        R                  S5         S[        5       ;   a  WR                  5         ggU R                  R                  SS9nUR                  S5        [        [        5      nUR                  5        H  nUS   US   4nXCU'   M     X0l        Xl        [        R#                  S	[%        U R                   5       35        S[        5       ;   a  WR                  5         ggg! [&         a+  n[        R                  S
[)        U5       35         SnANQSnAff = f! S[        5       ;   a  WR                  5         f f = f)z8Carga las configuraciones de umbrales con cache temporalNõ4   No se pudo establecer conexiÃ³n con la base de datosÚcursorT©Ú
dictionaryz¹
                    SELECT idSistema, idEntrada, vMin1, vMax1, tMax1, generaAlarma 
                    FROM configuraciones
                    WHERE generaAlarma = 1
                Ú	idSistemaÚ	idEntradaz.Configuraciones actualizadas. Total entradas: z Error cargando configuraciones: )r   Únowr!   Útotal_secondsr"   Úcheck_connectionr#   ÚerrorÚlocalsÚcloseÚconnr3   Úexecuter   r   Úfetchallr   r$   ÚlenÚ	ExceptionÚstr)r&   r8   r3   Únew_configsÚconfigÚkeyÚes          r)   r%   Ú&DeviationProcessor.load_configurations1   sr  € ä�lŠl‹nˆØ×#Ñ#Ñ+Ø×*Ñ*Ñ*×9Ñ9Ó;¸d×>YÑ>YÔYð#Ø×,Ñ,×.Ñ.Ü—L‘LÐ!WÔXØð* œv›xÓ'Ø—L‘L•Nð (ð' Ÿ™×)Ñ)°TÐ)Ð:�Ø—‘ð  ô ô *¬$Ó/�Ø$Ÿo™oÖ/�FØ! +Ñ.°°{Ñ0CÐD�CØ'- Ó$ñ 0ð  +”Ø*-Ô'Ü—‘ÐLÌSÐQU×Q]ÑQ]ÓM^ÐL_Ð`Ôað
 œv›xÓ'Ø—L‘L•Nð (ð5 Zøô. ó JÜ—‘Ð?ÄÀAÃ¸xÐH×IÑIûðJûð œv›xÓ'Ø—L‘L•Nð (ús1   Á*E ÂBE Å
FÅ!F Å;F Æ FÆF Æ!F)c                 óÄ   • U R                   U   nUS   nUS   nXCS   :”  a  U R                  XX55        gXCS   :  a  U R                  XX55        gU R                  U5        g)u<   Procesa una mediciÃ³n individual para detecciÃ³n de desvÃ­osÚtempÚfechaÚvMax1ÚvMin1N)r   Ú_handle_high_valueÚ_handle_low_valueÚ_reset_state)r&   rF   ÚmeasurementrE   ÚvalorÚcurrent_times         r)   Ú_process_measurementÚ'DeviationProcessor._process_measurementR   sh   € à—‘˜cÑ"ˆØ˜FÑ#ˆØ" 7Ñ+ˆð ˜'‘?Ó"Ø×#Ñ# C°ÕEØ˜G‘_Ó$Ø×"Ñ" 3¨vÕDà×Ñ˜cÕ"r+   c                 ó¸  • U R                   U   nUS   [        :X  a?  [        US'   XES'   X%S'   U R                  (       a  [        R                  SU SU 35        g
g
US   [        :X  ar  XES   -
  R                  5       US   :¼  aU  U R                  (       a  [        R                  SU SU 35        U R                  US   US	   U[        U5        [        US'   g
g
g
)u&   Maneja un valor por debajo del mÃ­nimor-   r.   r/   úEntrada u    iniciÃ³ valor bajo mÃ­nimo: ÚtMax1u    generando alarma por mÃ­nimo: r   r   N)r   r   r   Údebugr#   r9   Ú_add_to_alarm_batchr   )r&   rF   rR   rE   rS   Ústates         r)   rO   Ú$DeviationProcessor._handle_low_value`   sá   € à×%Ñ% cÑ*ˆà�Ñ¤Ó,Ü /ˆE�*ÑØ".�,ÑØ"'�,ÑØ�z�zÜ—‘˜x¨ uÐ,IÈ%ÈÐQÕRð ð �:Ñ¤/Ó1Ø \Ñ2Ñ2×AÑAÓCÀvÈgÁÓVØ—:—:Ü—L‘L 8¨C¨5Ð0OÐPUÈwÐ!WÔXØ×(Ñ(¨¨Q©°°Q±¸ÄÐQ]Ô^Ü$3��jÒ!ð	 Wð 2r+   c                 óü   • U R                      [        R                  SU SU SU SU 35        U R                  R	                  UUUU[
        R                  " 5       SS.5        SSS5        g! , (       d  f       g= f)u/   AÃ±ade una alarma al lote para inserciÃ³n batchzAgregando alarma - Sistema: ú, Entrada: ú	, Valor: z
, Estado: r   )r6   r7   rR   ÚidEstadorK   ÚactivaN)r   r#   rY   r   Úappendr   r8   )r&   Ú
id_sistemaÚ
id_entradarR   Ú	id_estados        r)   rZ   Ú&DeviationProcessor._add_to_alarm_batchr   sx   € à�_‹_Ü�L‰LØ.¨z¨lð ;Ø&˜< y°°ð 8Ø$˜+ð'ôð
 ×Ñ×$Ñ$Ø'Ø'ØØ%Ü!Ÿš›Øñ&ô ÷ �_Ž_ús   �AA-Á-
A;c           
      ób  • U R                   (       d  g U R                  5       (       d6  [        R                  S5         S[	        5       ;   a  WR                  5         ggU R                  R                  5       nSnU R                    Vs/ sH  nUS   US   US   US   US	   US
   4PM     nnUR                  X$5        U R                  R                  5         U R                  (       a,  [        R                  S[        U R                   5       S35        U R                   R                  5         S[	        5       ;   a  WR                  5         ggs  snf ! [         a+  n[        R                  S[        U5       35         SnANUSnAff = f! S[	        5       ;   a  WR                  5         f f = f)u=   Inserta todas las alarmas acumuladas en una sola transacciÃ³nNr2   r3   z˜
                INSERT INTO alarmas (idSistema, idEntrada, valor, idEstado, fecha, activa)
                VALUES (%s, %s, %s, %s, %s, %s)
            r6   r7   rR   r`   rK   ra   zInsertadas z alarmas en batchz#Error insertando alarmas en batch: )r   r:   r#   r;   r<   r=   r>   r3   ÚexecutemanyÚcommitrY   rA   ÚclearrB   rC   )r&   r3   ÚqueryÚaÚvaluesrG   s         r)   Ú_flush_alarmsÚ DeviationProcessor._flush_alarmsƒ   s{  € à× × Øð	Ø×(Ñ(×*Ñ*Ü—‘ÐSÔTØð. œ6›8Ó#Ø—‘•ð $ð+ —Y‘Y×%Ñ%Ó'ˆFðˆEð #×/Ò/ó1á/˜ð ˜‘~ q¨¡~°q¸±zØ˜
‘m Q w¡Z°°8±ó>á/ð ð 1ð ×Ñ˜uÔ-Ø�I‰I×ÑÔà�z�zÜ—‘˜{¬3¨t×/@Ñ/@Ó+AÐ*BÐBSÐTÔUà×Ñ×#Ñ#Ô%ð
 œ6›8Ó#Ø—‘•ð $ùò1øô ó 	IÜ�L‰LÐ>¼sÀ1»v¸hÐG×HÑHûð	Iûð œ6›8Ó#Ø—‘•ð $úsB   ”*E Á*E Â	#EÂ,BE ÅE Å
F
Å!FÆ F ÆF
Æ
F Æ!F.c                 ó¶   • U R                   U   S   nU[        :w  a=  [        R                  SUS    SU S35        U R	                  5       U R                   U'   gg)zFResetea el estado a normal cuando el valor vuelve a la banda permitidar-   rW   r   z: Reseteando estado z	 a NORMALN)r   r   r#   rY   r   )r&   rF   Úcurrent_states      r)   rP   ÚDeviationProcessor._reset_state¥   sb   € à×-Ñ-¨cÑ2°:Ñ>ˆØœLÓ(Ü�L‰LØ˜3˜q™6˜(Ð"6°}°oÀYÐOôð *.×)CÑ)CÓ)EˆD×!Ñ! #Ò&ð	 )r+   c                 ól   >• U R                  5         [        TU ]	  5         [        R	                  S5        g)z(Detiene el procesador y realiza limpiezau-   Procesador de desvÃ­os detenido correctamenteN)rn   r   Ústopr#   r$   )r&   r(   s    €r)   rt   ÚDeviationProcessor.stop¯   s%   ø€ à×ÑÔÜ‰‰ŒÜ�‰ÐCÕDr+   c                 ó.  • SSSSSS.[        U R                  5      U R                  (       a  U R                  R                  5       OSS.S[        U R                  5      0S.nU R
                  R                  5        H”  nUS   nU[        :X  a  US   S	==   S
-  ss'   M$  U[        :X  a  US   S==   S
-  ss'   M@  U[        :X  a  US   S==   S
-  ss'   M\  U[        :X  a  US   S==   S
-  ss'   Mx  U[        :X  d  M„  US   S==   S
-  ss'   M–     U$ )u;   
Retorna las mÃ©tricas actuales del procesador de desvÃ­os
r   )ÚnormalÚ	above_maxÚ	below_minÚ	alarm_maxÚ	alarm_minN)ÚtotalÚlast_updateÚpending)ÚstatesÚconfigurationsÚalarmsr-   r   rw   r   rx   ry   rz   r{   )rA   r   r!   Ú	isoformatr   r   rm   r   r   r   r   r   )r&   Úcurrent_metricsÚ
state_infor-   s       r)   Úget_metricsÚDeviationProcessor.get_metricsµ   s$  € ð ØØØØñô ˜TŸ\™\Ó*ØFJ×F]×F]˜t×6Ñ6×@Ñ@ÔBÐcgñð
 œ3˜t×0Ñ0Ó1ðñ
ˆð$ ×/Ñ/×6Ñ6Ö8ˆJØ! *Ñ-ˆHØœ<Ó'Ø Ñ)¨(Ó3°qÑ8Õ3Øœ_Ó,Ø Ñ)¨+Ó6¸!Ñ;Õ6Øœ_Ó,Ø Ñ)¨+Ó6¸!Ñ;Õ6Øœ_Ó,Ø Ñ)¨+Ó6¸!Ñ;Õ6Øœ_Õ,Ø Ñ)¨+Ó6¸!Ñ;Õ6ñ 9ð Ðr+   c           
      óî  • U R                   (       GaÔ   U R                  5       (       dl  [        R                  S5        [        R
                  " S5         S[        5       ;   a  WR                  5         S[        5       ;   d  M‚  WR                  5         M”  U R                  R                  SS9nU R                  5         UR                  SU R                  45        UR                  5       nU(       d  U R                  (       a  [        R                  S5        [        R
                  " S	5         S[        5       ;   a  UR                  5         S[        5       ;   d  GM]  WR                  5         GMp  / nU GHa  nUS
   US   4nX`R                  ;   Ga/  U R                  (       a"  [        R                  SUS    SUS    S35        U R                  U   nUS   nUS   n	X‡S   :”  aI  U R                  (       a%  [        R                  SUS    SU SUS    S35        U R!                  XhXy5        O’X‡S   :  aI  U R                  (       a%  [        R                  SUS    SU SUS    S35        U R#                  XhXy5        OAU R                  (       a  [        R                  SUS    SU S35        U R%                  U5        UR'                  US   5        GMd     U(       a´  U R                  (       a"  [        R                  S[)        U5       S35        SR+                  S/[)        U5      -  5      n
U R                  R                  5       nSU
 S3nUR                  U[,        R.                  " 5       /U-   5        U R                  R1                  5         S[        5       ;   a  WR                  5         S[        5       ;   a  WR                  5         U R                   (       a  GMÓ  g"g"! [2         a@  n[        R                  S [5        U5       3SS!9  [        R
                  " S5         S"nAN—S"nAff = f! S[        5       ;   a  WR                  5         S[        5       ;   a  WR                  5         f f = f)#z0Procesa las mediciones pendientes en tiempo realr2   é   r3   Úupdate_cursorTr4   a  
                    SELECT 
                        bb.id,
                        bb.dmac,
                        bb.temp,
                        bb.fecha,
                        m.idSistema,
                        e.idEntrada 
                    FROM bandeja_blue bb
                    JOIN modbus m ON bb.dmac = m.dmac
                    JOIN entradas e ON m.idModbus = e.idModbus
                    WHERE bb.procesado_el IS NULL
                    ORDER BY bb.fecha
                    LIMIT %s
                z&No hay nuevas mediciones para procesarr   r6   r7   u   Procesando mediciÃ³n - DMAC: Údmacr_   rJ   u   Â°CrK   rL   zValor alto detectado - DMAC: u   Â°C > Max: rM   zValor bajo detectado - DMAC: u   Â°C < Min: zValor normal - DMAC: Úidz	Marcando z mediciones como procesadasz, z%sz‚
                        UPDATE bandeja_blue 
                        SET procesado_el = %s 
                        WHERE id IN (z)
                    zError procesando mediciones: )Úexc_infoN)Úrunningr:   r#   r;   ÚtimeÚsleepr<   r=   r>   r3   r%   r?   r    r@   rY   r   rN   rO   rP   rb   rA   Újoinr   r8   ri   rB   rC   )r&   r3   r‰   ÚmeasurementsÚprocessed_idsrQ   rF   rE   rR   rK   ÚplaceholdersÚupdate_queryrG   s                r)   Úprocess_pendingÚ"DeviationProcessor.process_pendingÚ   sì  € à�l�lˆlða*Ø×,Ñ,×.Ñ.Ü—L‘LÐ!WÔXÜ—J’J˜q”MØðt œv›xÓ'Ø—L‘L”NØ"¤f£hÕ.Ø!×'Ñ'Ö)ðw Ÿ™×)Ñ)°TÐ)Ð:�ð ×(Ñ(Ô*ð —‘ð  ð —o‘oÐ'ô)ð   &Ÿ™Ó0�Þ#Ø—z—zÜŸ™Ð%MÔNÜ—J’J˜q”MØðz œv›xÓ'Ø—L‘L”NØ"¤f£hÖ.Ø!×'Ñ'×)ð{ !#�Ü#/�KØ& {Ñ3°[ÀÑ5MÐN�CØŸl™lÔ*ØŸ:Ÿ:Ü"ŸL™LØ"?ÀÈFÑ@SÐ?Tð U*Ø*5°fÑ*=Ð)>¸cð!Côð
 "&§¡¨cÑ!2˜Ø +¨FÑ 3˜Ø +¨GÑ 4˜ð !¨'¡?Ó2Ø#ŸzŸzÜ &§¡Ø&CÀKÐPVÑDWÐCXð Y.Ø.3¨W°KÀÀwÁÐ?PÐPSð%Uô!"ð !×3Ñ3°CÀÕNØ"¨G¡_Ó4Ø#ŸzŸzÜ &§¡Ø&CÀKÐPVÑDWÐCXð Y.Ø.3¨W°KÀÀwÁÐ?PÐPSð%Uô!"ð !×2Ñ2°3¸vÕMà#ŸzŸzÜ &§¡Ø&;¸KÈÑ<OÐ;Pð Q.Ø.3¨W°Cð%9ô!"ð !×-Ñ-¨cÔ2à!×(Ñ(¨°TÑ):×;ñI $0öN !Ø—z—zÜŸ™ y´°]Ó1CÐ0DÐD_Ð%`Ôaà#'§9¡9¨d¨V´c¸-Ó6HÑ-HÓ#I�LØ$(§I¡I×$4Ñ$4Ó$6�Mð(&ð '3 ^ð 4ð$�Lð
 "×)Ñ)¨,¼¿º»Ð8HÈ=Ñ8XÔYØ—I‘I×$Ñ$Ô&ð œv›xÓ'Ø—L‘L”NØ"¤f£hÓ.Ø!×'Ñ'Ô)ðE �l�lŒløôv ó Ü—‘Ð<¼SÀ»V¸HÐEÐPT�ÑUÜ—
’
˜1—‘ûðûð œv›xÓ'Ø—L‘L”NØ"¤f£hÓ.Ø!×'Ñ'Õ)ð /ús8   ”A O( ÂBO( Å1H%O( Ï(
P2Ï26P-Ð(P5 Ð-P2Ð2P5 Ð5?Q4c                 óv  • U R                   U   nU R                  (       a*  [        R                  SUS    SUS    SU SUS    35        US   [        :X  a9  [        US'   XES'   X%S	'   U R                  (       a  [        R                  S
5        ggUS   [        :X  aœ  XES   -
  R                  5       nU R                  (       a  [        R                  SU SUS    S35        XcS   :¼  aN  U R                  (       a  [        R                  S5        U R                  US   US   U[        5        [        US'   ggg)u%   Maneja un valor que supera el mÃ¡ximoz Manejando valor alto - Sistema: r   r^   r   r_   u   Â°C, Estado actual: r-   r.   r/   zCambiando a estado ABOVE_MAXzTiempo en ABOVE_MAX: u    segundos (mÃ¡ximo permitido: rX   z
 segundos)u   Generando alarma por mÃ¡ximoN)r   rY   r#   r   r   r9   rZ   r   )r&   rF   rR   rE   rK   r[   Útime_in_states          r)   rN   Ú%DeviationProcessor._handle_high_value@  sA  € à×%Ñ% cÑ*ˆà�:�:Ü�L‰LØ2°3°q±6°(ð ;Ø ™F˜8 9¨U¨Gð 4"Ø"'¨
Ñ"3Ð!4ð6ôð �Ñ¤Ó,Ü /ˆE�*ÑØ"'�,ÑØ"'�,ÑØ�z�zÜ—‘Ð;Õ=ð ð �:Ñ¤/Ó1Ø"¨<Ñ%8Ñ8×GÑGÓIˆMØ�z�zÜ—‘Ø+¨M¨?ð ;+Ø+1°'©?Ð*;¸:ðGôð
  w¡Ó/Ø—:—:Ü—L‘LÐ!?Ô@Ø×(Ñ(¨¨Q©°°Q±¸ÄÔPÜ$3��jÒ!ð	 0ð 2r+   )r   r   r    r"   r   r   r!   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r   r%   rT   rO   rZ   rn   rP   rt   r…   r•   rN   Ú__static_attributes__Ú__classcell__)r(   s   @r)   r   r      sK   ø† õ
#ò
ò#òB#ò4ò$ò" òDFõEò#òJd*÷L4ð 4r+   r   )Ú__doc__r   r   r   rŽ   ÚloggingÚtypingr   r   Úcollectionsr   Úbaser	   Úconfig.constantsr   r   r   r   r   r   r   Ú	getLoggerrš   r#   r   © r+   r)   Ú<module>r¨      sP   ðñ÷ )Û Û Û ß Ý #Ý ÷÷ ñ ð 
×	Ò	˜8Ó	$€ôB4˜õ B4r+   