
    ezh7                     @    S SK r S SKrS SKJr  S SKJr   " S S5      rg)    N)Medicion)DatabaseConnectionc                   B    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
rg)MessageProcessor   z$Procesador principal de mensajes IoTc                 "    [        5       U l        g )N)r   db)selfs    B/var/www/ev-aguas/ev-aguas-proceso/processors/message_processor.py__init__MessageProcessor.__init__	   s    $&    c                     [         R                  " UR                  5       5      nSU;  d
  US   (       d  [        R                  " S5        g[        U5      nUR                  U5      nU(       d  [        R                  " S5        g[        R                  " SU 35        U R                  U5      nUc  [        R                  " SU 35        gXSl	        U R                  U5      nUS   $ ! [         R                   a#  n[        R                  " S	U 35         SnAgSnAf[         a#  n[        R                  " S
U 35         SnAgSnAff = f)u:   Procesa una sola línea de mensaje JSON (método original)
objectJSONz!Mensaje sin objectJSON, omitiendoF0No se pudo obtener identificador del dispositivo$Buscando medidor con identificador: NMedidor no encontrado: successzError decodificando JSON: zError procesando mensaje: )jsonloadsstriploggingwarningr   get_device_identifierinfo_get_medidor_id
id_medidor _insert_medicion_and_tiempo_realJSONDecodeErrorerror	Exception)r
   message_linemessagemediciondevice_identifierr   resultes           r   process_single_message'MessageProcessor.process_single_message   s'   $	jj!3!3!56G 7*',2G CD  (H !) > >w G$ RSLL?@Q?RST--.?@J!"9:K9L MN", ::8DF)$$## 	MM6qc:; 	MM6qc:;	s7   A
C* 9C* AC* C* *E>DE)EEc                      [         R                  " UR                  5       5      nSU;  d
  US   (       d  SSSS.$  [         R                  " US   5      nU(       a  [        U[        5      (       d  SSSS.$ / S	QnU Vs/ sH  ofU;  d  M
  UPM     nnU(       a  SSS
SR                  U5       3S.$  [        U5      nUR                  U5      n	U	(       d  SSSS.$ [        R                  " SU	 35        U R                  U	5      n
U
S   (       d  U
S   S:X  a	  SSSU	 3S.$ SSSU
S    3S.$ U
S   Ul        U R                  UR                  5      nUbb  Ub  [!        U5      OSn[#        UR$                  U-
  S5      Ul        [        R                  " SUR$                   SU SUR&                   35        OSUl        [        R                  " S5        U R)                  U5      nU$ ! [         R                   a  nSSS[	        U5       3S.s SnA$ SnAff = fs  snf ! [         R                  [        4 a  nSSS[	        U5       3S.s SnA$ SnAff = f! [*         a  nSSS[	        U5       3S.s SnA$ SnAff = f)uM   Procesa una sola línea de mensaje JSON con información detallada de erroresF
data_erroru   JSON inválido: r   
error_typeerror_reasonNr   zMensaje sin objectJSONu   objectJSON vacío o inválido)addresscumulativeValue	innerTimez'objectJSON no tiene campos esenciales: z, u   objectJSON inválido: r   r   r   r-   	not_foundr   system_errorzError de base de datos: r.   r   g           zDelta calculado: z - z = u+   Primera medición del medidor, delta = NonezError inesperado: )r   r   r   r   str
isinstancedictjoin	TypeErrorr   r   r   r   _get_medidor_id_detailedr   _get_last_cumul_flow_valuefloatroundcumul_flow_valuedelta_acumulador   r!   )r
   r"   r#   r'   object_datarequired_fieldsfieldmissing_fieldsr$   r%   id_medidor_resultlast_cumul_valuelast_cumul_floatinsert_results                 r   process_single_message_detailed0MessageProcessor.process_single_message_detailed4   s   c	**\%7%7%9: 7*',2G$".$< "jj)>?"*[$*G*G#(&2(G  #N5D!a_EU`H`%_!a!#(&2*QRVR[R[\jRkQl(m  "  (H !) > >w G$$".$V  LL?@Q?RST $ = =>O P$Y/$\2kA#(&2*ABSAT(U  $)&4*BCTUcCdBe(f  #4L"AH  $>>x?R?RS+>N>Z5)9#:`c +01J1JM]1]_`+a(01J1J0K3O_N``cdld|d|c}~+/(JK !AA(KM  q '' $".&6s1vh$? 8 "b (()4 $".&<SVH$E l  	 ,"4SVH = 	s   $G* I :H" 9H" HH H" 4)I AI $I 0B9I *H>HHI HI H" "I<III II 
J%I<6J<Jc                    U R                   R                  5       (       d  g U R                   R                  5       nSnUR                  X145        UR	                  5       nU(       a;  [
        R                  " SUS    35        US   U R                   R                  5         $ [
        R                  " SU 35         U R                   R                  5         g! [         a=  n[
        R                  " SU 35         SnAU R                   R                  5         gSnAff = f! U R                   R                  5         f = f)u=   Busca el ID del medidor por eui (comparación en mayúsculas)N
                SELECT idMedidor 
                FROM medidores 
                WHERE UPPER(eui) = UPPER(%s) 
                AND deleted_at IS NULL
                LIMIT 1
            Medidor encontrado con ID: r   Medidor no encontrado en DB: Error buscando medidor: )r	   connect
get_cursorexecutefetchoner   r   
disconnectr   r!   r    r
   r%   cursorqueryr&   r'   s         r   r    MessageProcessor._get_medidor_id   s    ww  	!WW'')FE NN5"67__&F:6!9+FGay GG  "?@Q?R ST GG 	  	MM4QC89GG 		 GG s0   A%C "C 
D!D:D! DD! !D=c                    U R                   R                  5       (       d  SSSS.$  U R                   R                  5       nSnUR                  X145        UR	                  5       nU(       a@  [
        R                  " SUS    35        SUS   S	S	S
.U R                   R                  5         $ [
        R                  " SU 35        SSSU 3S.U R                   R                  5         $ ! [         aL  n[
        R                  " SU 35        SS[        U5      S.s S	nAU R                   R                  5         $ S	nAff = f! U R                   R                  5         f = f)u=   Busca el ID del medidor con información detallada de erroresFconnection_error&No se pudo conectar a la base de datosr,   rK   rL   r   TN)r   r   r-   r.   rM   r2   r   rN   database_error)r	   rO   rP   rQ   rR   r   r   rS   r   r!   r    r5   rT   s         r   r:   )MessageProcessor._get_medidor_id_detailed   sF   ww   0 H '	!WW'')FE NN5"67__&F:6!9+FG#"()"&$(	, GG  "?@Q?R ST$"-&=>O=P$Q GG   	MM4QC89 . #A  GG 	 GG s6   A*C( ,!C( (
D>2'D9D>E 9D>>E Ec                    U R                   R                  5       (       d  SSSS.$  U R                   R                  5       nSnUR                  X1R	                  5       5        [
        R                  " SUR                   35        [
        R                  " SUR	                  5        35        SnUR                  UUR                  UR                  UR                  UR                  (       a  UR                  OS	UR                  (       a  UR                  OS	UR                  UR                  UR                  UR                  4	5        [
        R                  " S
UR                   35        U R                   R!                  5         SSSS.U R                   R#                  5         $ ! [$         a  nU R                   R&                  (       a$  U R                   R&                  R)                  5         [
        R*                  " SU 35        SS[-        U5      S.s SnAU R                   R#                  5         $ SnAff = f! U R                   R#                  5         f = f)u>   Inserta medición en ambas tablas usando una sola transacciónFr3   rZ   r,   aC  
                INSERT INTO mediciones 
                (idMedidor, nserie, fecha_recepcion, meter_time, rssi, 
                 cumul_flow_value, daily_flow_value, reverse_flow_value, 
                 flow_rate_value, temperatura, delta_acumulado, status)
                VALUES 
                (%(idMedidor)s, %(nserie)s, %(fecha_recepcion)s, %(meter_time)s, %(rssi)s, 
                 %(cumul_flow_value)s, %(daily_flow_value)s, 
                 %(reverse_flow_value)s, %(flow_rate_value)s, 
                 %(temperatura)s, %(delta_acumulado)s, %(status)s)
            u9   Medición insertada en tabla mediciones para medidor ID: zDatos insertados: a  
                INSERT INTO tiempo_real 
                (idMedidor, lastReporte, estado, 
                 acumulado, diario, rssi, temperatura, cumulFlowUnit, dailyFlowUnit)
                VALUES 
                (%s, %s, %s, %s, %s, %s, %s, %s, %s)
                ON DUPLICATE KEY UPDATE
                    lastReporte = VALUES(lastReporte),
                    estado = VALUES(estado),
                    acumulado = VALUES(acumulado),
                    diario = VALUES(diario),
                    rssi = VALUES(rssi),
                    temperatura = VALUES(temperatura),
                    cumulFlowUnit = VALUES(cumulFlowUnit),
                    dailyFlowUnit = VALUES(dailyFlowUnit)
            r   z)Tiempo real actualizado para medidor ID: TNu*   Error insertando medición y tiempo real: )r	   rO   rP   rQ   to_dictr   r   r   fecha_recepcionstatusr>   daily_flow_valuerssitemperaturacumul_flow_unitdaily_flow_unitcommitrS   r!   
connectionrollbackr    r5   )r
   r$   rU   mediciones_querytiempo_real_queryr'   s         r   r   1MessageProcessor._insert_medicion_and_tiempo_real   s   ww   , H J	!WW'')F
  NN+-=-=-?@LLTU]UhUhTijk LL-h.>.>.@-ABC!" NN,##((-5-F-F))A-5-F-F))A$$((((
/ 
 LLDXEXEXDYZ[ GGNN  " $" GG   		ww!!""++-MMFqcJK , #A  GG 		 GG s1   E$F& &
H;0A&H6H;H> 6H;;H> >Ic                    U R                   R                  5       (       d  g U R                   R                  5       nSnUR                  X145        UR	                  5       nU(       a  US   U R                   R                  5         $  U R                   R                  5         g! [         a=  n[        R                  " SU 35         SnAU R                   R                  5         gSnAff = f! U R                   R                  5         f = f)u<   Obtiene el último cumul_flow_value del medidor especificadoNz
                SELECT cumul_flow_value 
                FROM mediciones 
                WHERE idMedidor = %s 
                ORDER BY fecha_recepcion DESC, id DESC
                LIMIT 1
            r   u+   Error obteniendo último cumul_flow_value: )	r	   rO   rP   rQ   rR   rS   r!   r   r    )r
   r   rU   rV   r&   r'   s         r   r;   +MessageProcessor._get_last_cumul_flow_valueC  s    ww  	!WW'')FE NN5-0__&Fay GG   GG 	  	MMGsKLGG 		 GG s*   A	B" "
C),C$C, $C))C, ,D)r	   N)__name__
__module____qualname____firstlineno____doc__r   r(   rH   r   r:   r   r;   __static_attributes__ r   r   r   r      s/    .'&PeN!B0!dS!j!r   r   )r   r   models.medicionr   database.connectionr   r   rt   r   r   <module>rw      s      $ 2Y! Y!r   