ó
    ½£gŸ  ã                   ó|   • S 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	J
r
  \R                  " \5      r " S S5      rg)	uz   
Analizador de DesvÃ­os - MVP v1.0

Implementa la lÃ³gica de detecciÃ³n y gestiÃ³n de desvÃ­os
de valores fuera de rango.
é    N)Údatetime)Údefaultdicté   )ÚSTATE_NORMALÚSTATE_ABOVE_MAXÚSTATE_ALARM_MAXÚSTATE_BELOW_MINÚSTATE_ALARM_MINc                   óJ   • \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rSrg)ÚDeviationAnalyzeré   c                 ó’   • 0 U l         [        U R                  5      U l        SU l        / U l        [        [        5      SSS.U l        g )NFr   )Úcurrent_statesÚtotal_deviationsÚtotal_alarms)Úconfigsr   Ú_create_default_stateÚstatesÚdebugÚalarm_batchÚintÚmetrics©Úselfs    Ú@/var/www/blue/EV-Temp_rev04/src/processors/realtime/deviation.pyÚ__init__ÚDeviationAnalyzer.__init__   sA   € ØˆŒÜ! $×"<Ñ"<Ó=ˆŒØˆŒ
ØˆÔä)¬#Ó.Ø !Øñ
ˆ�ó    c                 ó   • [         SSS.$ )z+Crea un estado por defecto para una entradaN)Ústate_idÚ
start_timeÚ
last_value)r   r   s    r   r   Ú'DeviationAnalyzer._create_default_state!   s   € ô %ØØñ
ð 	
r   c                 ó  •  UR                  SS9nUR                  S5        0 nUR                  5        H  nUS   US   4nXCU'   M     X0l        U R                  (       a,  [
        R	                  S[        U R                  5       S35        S
[        5       ;   a  WR                  5         g	g	! [         a+  n[
        R                  S[        U5       35         S	nANPS	nAff = f! S
[        5       ;   a  WR                  5         f f = f)z4Actualiza las configuraciones desde la base de datosT)Ú
dictionaryzç
                SELECT 
                    idSistema, idEntrada, 
                    vMin1, vMax1, tMax1, 
                    generaAlarma
                FROM configuraciones
                WHERE generaAlarma = 1
            Ú	idSistemaÚ	idEntradazConfiguraciones actualizadas: z	 entradasz$Error actualizando configuraciones: NÚcursor)r(   ÚexecuteÚfetchallr   r   ÚloggerÚlenÚ	ExceptionÚerrorÚstrÚlocalsÚclose)r   Úconnr(   Únew_configsÚconfigÚkeyÚes          r   Úupdate_configurationsÚ'DeviationAnalyzer.update_configurations)   sï   € ð	Ø—[‘[¨D�[Ð1ˆFØ�N‰Nð ô ð ˆKØ Ÿ/™/Ö+�Ø˜kÑ*¨F°;Ñ,?Ð@�Ø#)˜CÓ ñ ,ð 'ŒLØ�z�zÜ—‘Ð=¼cÀ$Ç,Á,Ó>OÐ=PÐPYÐZÔ[ð
 œ6›8Ó#Ø—‘•ð $øô ó 	JÜ�L‰LÐ?ÄÀAÃ¸xÐH×IÑIûð	Jûð œ6›8Ó#Ø—‘•ð $ús*   ‚B
B, Â,
C!Â6!CÃC$ ÃC!Ã!C$ Ã$!Dc                 ó  • SSSS.nX4nX`R                   ;  a  U$ U R                   U   nU R                  U   nU R                  (       a$  [        R                  SU SU SU SUS    35        X7S   :”  a"  UR	                  U R                  XcXt5      5        OMX7S	   :  a"  UR	                  U R                  XcXt5      5        O#US   [        :w  a  U R                  U5        S
US'   U R                  S   US   ==   S-  ss'   U$ )u  
Analiza una mediciÃ³n para detectar desvÃ­os

Args:
    id_sistema (int): ID del sistema
    id_entrada (int): ID de la entrada
    valor (float): Valor medido
    fecha (datetime): Timestamp de la mediciÃ³n
    
Returns:
    dict: Resultado del anÃ¡lisis
F)Údeviation_detectedÚalarm_generatedÚstate_changedzAnalizando - Sistema: ú, Entrada: z	, Valor: z, Estado actual: r    ÚvMax1ÚvMin1Tr<   r   é   )
r   r   r   r+   ÚupdateÚ_handle_high_valueÚ_handle_low_valuer   Ú_reset_stater   )	r   Ú
id_sistemaÚ
id_entradaÚvalorÚfechaÚresultr5   r4   Ústates	            r   ÚanalyzeÚDeviationAnalyzer.analyzeE   s$  € ð #(Ø$Ø"ñ
ˆð Ð&ˆØ—l‘lÓ"ØˆMà—‘˜cÑ"ˆØ—‘˜CÑ ˆà�:�:Ü�L‰LØ(¨¨°KÀ
¸|ð LØ˜Ð 1°%¸
Ñ2CÐ1DðFôð ˜'‘?Ó"Ø�M‰MØ×'Ñ'¨°FÓBõð ˜G‘_Ó$Ø�M‰MØ×&Ñ& s°6ÓAõð �ZÑ ¤LÓ0Ø×!Ñ! #Ô&Ø*.��Ñ'ð 	�‰Ð%Ñ& u¨ZÑ'8Ó9¸QÑ>Ó9àˆr   c           	      óF  • U R                   U   nSSS.nUS   [        :X  aY  [        US'   XES'   X%S'   SUS'   U R                  S==   S	-  ss'   U R                  (       a  [
        R	                  S
U S35        U$ US   [        :X  a™  XES   -
  R                  5       nU R                  (       a"  [
        R	                  S
U SU SUS    S35        XsS   :¼  aI  U R                  US   US	   U[        U5        [        US'   SUS'   SUS'   U R                  S==   S	-  ss'   U$ )u%   Maneja un valor que supera el mÃ¡ximoTF©r:   r;   r    r!   r"   r<   r   r@   úEntrada u    cambiÃ³ a estado ABOVE_MAXz en ABOVE_MAX por õ    segundos (mÃ¡ximo: ÚtMax1Ú)r   r;   r   )	r   r   r   r   r   r+   Útotal_secondsÚ
_add_alarmr   ©r   r5   rG   r4   rH   rJ   rI   Útime_in_states           r   rB   Ú$DeviationAnalyzer._handle_high_valuex   óA  € à—‘˜CÑ ˆØ(,ÀÑGˆà�Ñ¤Ó,Ü /ˆE�*ÑØ"'�,ÑØ"'�,ÑØ&*ˆF�?Ñ#Ø�L‰LÐ+Ó,°Ñ1Ó,à�z�zÜ—‘˜x¨ uÐ,GÐHÔIð$ ˆð! �:Ñ¤/Ó1Ø"¨<Ñ%8Ñ8×GÑGÓIˆMà�z�zÜ—‘Ø˜s˜eÐ#5°m°_ð E!Ø!'¨¡Ð 1°ð4ôð
  w¡Ó/Ø—‘  A¡¨¨A©°´ÈÔNÜ$3��jÑ!Ø,0�Ð(Ñ)Ø*.��Ñ'Ø—‘˜^Ó,°Ñ1Ó,àˆr   c           	      óF  • U R                   U   nSSS.nUS   [        :X  aY  [        US'   XES'   X%S'   SUS'   U R                  S==   S	-  ss'   U R                  (       a  [
        R	                  S
U S35        U$ US   [        :X  a™  XES   -
  R                  5       nU R                  (       a"  [
        R	                  S
U SU SUS    S35        XsS   :¼  aI  U R                  US   US	   U[        U5        [        US'   SUS'   SUS'   U R                  S==   S	-  ss'   U$ )u&   Maneja un valor por debajo del mÃ­nimoTFrN   r    r!   r"   r<   r   r@   rO   u    cambiÃ³ a estado BELOW_MINz en BELOW_MIN por rP   rQ   rR   r   r;   r   )	r   r   r	   r   r   r+   rS   rT   r
   rU   s           r   rC   Ú#DeviationAnalyzer._handle_low_value™   rX   r   c                 ó�   • U R                   (       a  [        R                  SU 35        U R                  5       U R                  U'   g)zResetea el estado a normalzReseteando estado de entrada N)r   r+   r   r   )r   r5   s     r   rD   ÚDeviationAnalyzer._reset_stateº   s4   € à�:�:Ü�L‰LÐ8¸¸Ð>Ô?à×5Ñ5Ó7ˆ�‰�CÒr   c           	      ó¦   • U R                   (       a  [        R                  SU SU SU 35        U R                  R                  UUUUUSS.5        g)z#Agrega una alarma al lote pendientezNueva alarma - Sistema: r=   z
, Estado: r@   )r&   r'   rG   ÚidEstadorH   ÚactivaN)r   r+   r   Úappend)r   rE   rF   rG   Ú	id_estadorH   s         r   rT   ÚDeviationAnalyzer._add_alarmÁ   s^   € à�:�:Ü�L‰LØ*¨:¨,ð 7Ø&˜< z°)°ð>ôð
 	×Ñ×ÑØ#Ø#ØØ!ØØñ!
õ 	r   c                 óB  • U R                   S   [           U R                   S   [           U R                   S   [           U R                   S   [           U R                   S   [
           S.U R                   S   U R                   S   [        U R                  5      S.nU$ )u    Obtiene mÃ©tricas del analizadorr   )ÚnormalÚ	above_maxÚ	alarm_maxÚ	below_minÚ	alarm_minr   r   )r   r   r   Úpending_alarms)r   r   r   r   r	   r
   r,   r   )r   r   s     r   Úget_metricsÚDeviationAnalyzer.get_metricsÒ   sš   € ð Ÿ,™,Ð'7Ñ8¼ÑFØ!Ÿ\™\Ð*:Ñ;¼OÑLØ!Ÿ\™\Ð*:Ñ;¼OÑLØ!Ÿ\™\Ð*:Ñ;¼OÑLØ!Ÿ\™\Ð*:Ñ;¼OÑLñð !%§¡Ð-?Ñ @Ø ŸL™L¨Ñ8Ü! $×"2Ñ"2Ó3ñ
ˆð ˆr   )r   r   r   r   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r   r7   rK   rB   rC   rD   rT   rj   Ú__static_attributes__© r   r   r   r      s2   † ò	
ò
òò81òfòBòB8òõ"r   r   )Ú__doc__Úloggingr   Úcollectionsr   Úconfig.constantsr   r   r   r	   r
   Ú	getLoggerrl   r+   r   rq   r   r   Ú<module>rw      s=   ðñó Ý Ý #÷õ ð 
×	Ò	˜8Ó	$€÷Kò Kr   