Ë
    ~ŸgÉ  ã                   ót   — d Z ddlmZmZ ddlZddlZddlmZmZmZ  ej                  e
«      Z G d„ d«      Zy)u  
Modelo Entrada - MVP v1.0

Representa un punto de mediciÃ³n y gestiona el procesamiento de sus datos por perÃ­odos.
Cada entrada corresponde a un sensor fÃ­sico y maneja la acumulaciÃ³n y cÃ¡lculo
de estadÃ­sticas de temperatura en intervalos de 15 minutos.
é    )ÚdatetimeÚ	timedeltaNé   )ÚPROCESS_INTERVALÚTEMP_MINÚTEMP_MAXc                   óB   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	dd	„Z
d
„ Zy)ÚEntradau×   
    Clase que representa un punto de mediciÃ³n.
    
    Maneja la recolecciÃ³n de mediciones y cÃ¡lculo de estadÃ­sticas por perÃ­odos
    de 15 minutos. Incluye validaciones de datos y gestiÃ³n de perÃ­odos.
    c                 ó>  — || _         || _        |j                  |j                  t        z  t        z  dd¬«      | _        | j
                  t        t        ¬«      z   | _        d| _        t        d«      | _
        t        d«      | _        g | _        d| _        d | _        y )Nr   )ÚminuteÚsecondÚmicrosecond©Úminutesú-infÚinf)Ú
id_entradaÚdmacÚreplacer   r   Úperiodo_inicior   Úperiodo_finÚvalor_acumuladoÚfloatÚvalor_maximoÚvalor_minimoÚ
medicionesÚcantidad_medicionesÚultima_medicion)Úselfr   r   Úfecha_inicios       ú9/Users/jma/desarrollo/EV-Temp_rev04/src/models/entrada.pyÚ__init__zEntrada.__init__   s™   € Ø$ˆŒØˆŒ	ð +×2Ñ2Ø ×'Ñ'Ô+;Ñ;Ô?OÑOØØð 3ó 
ˆÔð
  ×.Ñ.´ÔCSÔ1TÑTˆÔð  !ˆÔÜ! &›MˆÔÜ! %›LˆÔØˆŒØ#$ˆÔ Ø#ˆÕó    c                 óª  — t         |cxk  r	t        k  s)n t        j                  d| j                  › d|› d�«       y|| j
                  k  s|| j                  k\  rCt        j                  d| j                  › d|d›d| j
                  d›d	| j                  d
›�«       y| j                  j                  ||f«       | xj                  |z  c_	        t        | j                  |«      | _        t        | j                  |«      | _        | xj                  dz  c_        || _        t        j!                  d| j                  › d|› d| j                  › �«       y)u7  
        Agrega una nueva mediciÃ³n y valida que corresponda al perÃ­odo actual.
        
        Args:
            valor (float): Valor de temperatura
            fecha (datetime): Timestamp de la mediciÃ³n
            
        Returns:
            bool: True si la mediciÃ³n fue agregada exitosamente
        z(Temperatura fuera de rango para entrada z: u   Â°CFu)   MediciÃ³n fuera de perÃ­odo para entrada z: fecha=ú%Y-%m-%d %H:%Mu   , perÃ­odo=ú-ú%H:%Mé   u   MediciÃ³n agregada - DMAC: z	, Valor: u   Â°C, Total: T)r   r   ÚloggerÚwarningr   r   r   r   Úappendr   Úmaxr   Úminr   r   r   Údebug)r   ÚvalorÚfechas      r!   Úagregar_medicionzEntrada.agregar_medicion,   sM  € ô ˜5Ô,¤HÔ,Ü�N‰NØ:¸4¿9¹9¸+ÀRÈÀwÈcÐRôð ð �4×&Ñ&Ò&¨%°4×3CÑ3CÒ*CÜ�N‰NØ;¸D¿I¹I¸;ð GØ˜~Ð.ð /Ø ×/Ñ/°Ð?¸qÀ×AQÑAQÐRWÐ@XðZôð
 ð 	�‰×Ñ  u˜~Ô.Ø×Ò Ñ%ÕÜ × 1Ñ 1°5Ó9ˆÔÜ × 1Ñ 1°5Ó9ˆÔØ× Ò  AÑ%Õ Ø$ˆÔä�‰Ø)¨$¯)©)¨ð 5Ø�W˜L¨×)AÑ)AÐ(BðDô	
ð
 r#   c                 óü   — | j                   sy| j                  «       }| j                  «       }| j                  | j                  |t        | j                  d«      t        | j                  d«      || j                  dœS )u¡   
        Calcula las estadÃ­sticas del perÃ­odo actual.
        
        Returns:
            dict: Diccionario con estadÃ­sticas o None si no hay datos
        Nr(   )r   r   ÚpromedioÚmaximoÚminimoÚdesvior   )	r   Úget_promedioÚ
get_desvior   r   Úroundr   r   r   )r   r3   r6   s      r!   Úget_estadisticaszEntrada.get_estadisticasV   sw   € ð �ŠØð ×$Ñ$Ó&ˆØ—‘Ó"ˆð #×1Ñ1Ø×+Ñ+Ø Ü˜D×-Ñ-¨qÓ1Ü˜D×-Ñ-¨qÓ1ØØ#'×#;Ñ#;ñ
ð 	
r#   c                 ób   — | j                   syt        | j                  | j                  z  d«      S )u˜   
        Calcula el promedio del perÃ­odo actual.
        
        Returns:
            float: Temperatura promedio o None si no hay mediciones
        Nr(   )r   r9   r   r   ©r   s    r!   r7   zEntrada.get_promedion   s,   € ð �ŠØÜ�T×)Ñ)¨D×,DÑ,DÑDÀaÓHÐHr#   c                 ó  ‡— t        | j                  «      dk  ry| j                  «       Št        ˆfd„| j                  D «       «      }t	        t        j                  |t        | j                  «      dz
  z  «      d«      S )u¤   
        Calcula la desviaciÃ³n estÃ¡ndar del perÃ­odo.
        
        Returns:
            float: DesviaciÃ³n estÃ¡ndar o 0 si hay menos de 2 mediciones
        r   r   c              3   ó4   •K  — | ]  }|d    ‰z
  dz  –— Œ y­w)r   r   N© )Ú.0Úxr3   s     €r!   ú	<genexpr>z%Entrada.get_desvio.<locals>.<genexpr>„   s   øè ø€ ÒM¸˜a ™d X™o°!Õ3ÑMùs   ƒr(   )Úlenr   r7   Úsumr9   ÚmathÚsqrt)r   Úsuma_cuadradosr3   s     @r!   r8   zEntrada.get_desvioy   sd   ø€ ô ˆt�‰Ó !Ò#Øà×$Ñ$Ó&ˆÜÓM¸T¿_¹_ÔMÓMˆÜ”T—Y‘Y˜~´°T·_±_Ó1EÈÑ1IÑJÓKÈQÓOÐOr#   c                 ó:   — || j                   t        d¬«      z   kD  S )uã   
        Verifica si el perÃ­odo debe cerrarse por timeout.
        
        Args:
            fecha_actual (datetime): Timestamp actual
            
        Returns:
            bool: True si el perÃ­odo debe cerrarse
        r(   r   )r   r   )r   Úfecha_actuals     r!   Údebe_cerrar_por_timeoutzEntrada.debe_cerrar_por_timeout‡   s   € ð ˜d×.Ñ.´À1Ô1EÑEÑEÐEr#   Nc           	      óX  — |€| j                   }|| _        | j                  t        t        ¬«      z   | _         d| _        t        d«      | _        t        d«      | _        g | _        d| _	        t        j                  d| j                  › d| j                  d›d	| j                   d
›�«       y)u­   
        Reinicia el perÃ­odo para comenzar uno nuevo.
        
        Args:
            fecha_inicio (datetime): Timestamp inicial opcional para el nuevo perÃ­odo
        Nr   r   r   r   u   PerÃ­odo reiniciado - DMAC: u   , Nuevo perÃ­odo: r%   ú - r'   )r   r   r   r   r   r   r   r   r   r   r)   r.   r   )r   r    s     r!   Úreiniciar_periodozEntrada.reiniciar_periodo“   s©   € ð ÐØ×+Ñ+ˆLð +ˆÔØ×.Ñ.´ÔCSÔ1TÑTˆÔð  !ˆÔÜ! &›MˆÔÜ! %›LˆÔØˆŒØ#$ˆÔ ä�‰Ø*¨4¯9©9¨+ð 6Ø#×2Ñ2°>ÐBÀ#Àd×FVÑFVÐW\ÐE]ð_õ	
r#   c           	      ór   — d| j                   › d| j                  › d| j                  d›d| j                  d›�S )u(   RepresentaciÃ³n en string de la entrada.zEntrada z (DMAC: u   ) - PerÃ­odo: r%   rL   r'   )r   r   r   r   r<   s    r!   Ú__str__zEntrada.__str__®   sH   € ð �t—‘Ð' x°·	±	¨{ð ;Ø×,Ñ,¨^Ð<¸CÀ×@PÑ@PÐQVÐ?WðYð	
r#   )N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r"   r1   r:   r7   r8   rJ   rM   rO   r?   r#   r!   r
   r
      s3   „ ñò$ò((òT
ò0	IòPò
Fó
ó6
r#   r
   )rS   r   r   ÚloggingrE   Úconfig.settingsr   r   r   Ú	getLoggerrP   r)   r
   r?   r#   r!   ú<module>rW      s9   ðñ÷ )Û Û ß BÑ Bà	ˆ×	Ñ	˜8Ó	$€÷c
ò c
r#   