ó
    Ù‰¢g\  ã                   ót   • S r SSKJrJr  SSKrSSKrSSKJrJrJr  \R                  " \
5      r " S S5      rg)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                   óR   • \ rS rSrSrS rS rS rS rS r	S r
S	 rSS jrS rSrg
)ÚEntradaé   uÃ   
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                 óþ   • Xl         X l        U R                  U5      U l        U R                  [	        [
        S9-   U l        SU l        [        S5      U l	        [        S5      U l
        / U l        SU l        S U l        g )N©Úminutesr   ú-infÚinf)Ú
id_entradaÚdmacÚ_normalizar_fechaÚperiodo_inicior   r   Úperiodo_finÚvalor_acumuladoÚfloatÚvalor_maximoÚvalor_minimoÚ
medicionesÚcantidad_medicionesÚultima_medicion)Úselfr   r   Úfecha_inicios       Ú1/var/www/blue/EV-Temp_rev04/src/models/entrada.pyÚ__init__ÚEntrada.__init__   ss   € Ø$ŒØŒ	ð #×4Ñ4°\ÓBˆÔØ×.Ñ.´ÔCSÑ1TÑTˆÔð  !ˆÔÜ! &›MˆÔÜ! %›LˆÔØˆŒØ#$ˆÔ Ø#ˆÕó    c                 óT   • UR                  UR                  [        -  [        -  SSS9$ )u¥   
Normaliza una fecha al cuarto de hora mÃ¡s cercano.

Args:
    fecha (datetime): Fecha a normalizar
    
Returns:
    datetime: Fecha normalizada al cuarto de hora
r   )ÚminuteÚsecondÚmicrosecond)Úreplacer$   r   )r   Úfechas     r   r   ÚEntrada._normalizar_fecha(   s3   € ð �}‰}Ø—L‘LÔ$4Ñ4Ô8HÑHØØð ð 
ð 	
r"   c                 óª  • [         Us=::  a
  [        ::  d)  O  [        R                  SU R                   SU S35        gX R
                  :  d  X R                  :¼  aC  [        R                  SU R                   SUS SU R
                  S S	U R                  S
 35        gU R                  R                  X45        U =R                  U-  sl	        [        U R                  U5      U l        [        U R                  U5      U l        U =R                  S-  sl        X l        [        R!                  SU R                   SU SU R                   35        g)uï   
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   Úvalorr(   s      r   Úagregar_medicionÚEntrada.agregar_medicion8   sE  € ô ˜5Õ,¤HÕ,Ü�N‰NØ:¸4¿9¹9¸+ÀRÈÀwÈcÐRôð ð ×&Ñ&Ó&¨%×3CÑ3CÓ*CÜ�N‰NØ;¸D¿I¹I¸;ð GØ˜~Ð.ð /Ø ×/Ñ/°Ð?¸qÀ×AQÑAQÐRWÐ@XðZôð
 ð 	�‰×Ñ ˜~Ô.Ø×Ò Ñ%ÕÜ × 1Ñ 1°5Ó9ˆÔÜ × 1Ñ 1°5Ó9ˆÔØ× Ò  AÑ%Õ Ø$Ôä�‰Ø)¨$¯)©)¨ð 5Ø�W˜L¨×)AÑ)AÐ(BðDô	
ð
 r"   c                 ó  • U R                   (       d  gU R                  5       nU R                  5       nU R                  U R                  U[        U R                  S5      [        U R                  S5      UU R                  S.$ )uy   
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   r9   r<   s      r   Úget_estadisticasÚEntrada.get_estadisticasb   sw   € ð ��Øð ×$Ñ$Ó&ˆØ—‘Ó"ˆð #×1Ñ1Ø×+Ñ+Ø Ü˜D×-Ñ-¨qÓ1Ü˜D×-Ñ-¨qÓ1ØØ#'×#;Ñ#;ñ
ð 	
r"   c                 ól   • U R                   (       d  g[        U R                  U R                  -  S5      $ )up   
Calcula el promedio del perÃ­odo actual.

Returns:
    float: Temperatura promedio o None si no hay mediciones
Nr.   )r   r?   r   r   ©r   s    r   r=   ÚEntrada.get_promedioz   s,   € ð ��ØÜ�T×)Ñ)¨D×,DÑ,DÑDÀaÓHÐHr"   c                 ó  ^• [        U R                  5      S:  a  gU R                  5       m[        U4S jU R                   5       5      n[	        [
        R                  " U[        U R                  5      S-
  -  5      S5      $ )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   ó6   >#   • U H  oS    T-
  S-  v •  M     g7f)r   r   N© )Ú.0Úxr9   s     €r   Ú	<genexpr>Ú%Entrada.get_desvio.<locals>.<genexpr>�   s   øé € ÐM¹_¸ ™d X™o°!Ö3º_ùs   ƒr.   )Úlenr   r=   Úsumr?   ÚmathÚsqrt)r   Úsuma_cuadradosr9   s     @r   r>   ÚEntrada.get_desvio…   sd   ø€ ô ˆt�‰Ó !Ó#Øà×$Ñ$Ó&ˆÜÔM¸T¿_º_ÓMÓMˆÜ”T—Y’Y˜~´°T·_±_Ó1EÈÑ1IÑJÓKÈQÓOÐOr"   c                 ó2   • XR                   [        SS9-   :„  $ )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_timeoutÚEntrada.debe_cerrar_por_timeout“   s   € ð ×.Ñ.´À1Ñ1EÑEÑEÐEr"   Nc           	      óv  • Uc  U R                   nOU R                  U5      nX l        U R                  [        [        S9-   U l         SU l        [        S5      U l        [        S5      U l        / U l	        SU l
        [        R                  SU R                   SU R                  S S	U R                   S
 35        g)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/   r4   r   )r   r   Únuevo_inicios      r   Úreiniciar_periodoÚEntrada.reiniciar_periodoŸ   s¹   € ð Ñà×+Ñ+‰Lð  ×1Ñ1°,Ó?ˆLð +ÔØ×.Ñ.´ÔCSÑ1TÑTˆÔð  !ˆÔÜ! &›MˆÔÜ! %›LˆÔØˆŒØ#$ˆÔ ä�‰Ø*¨4¯9©9¨+ð 6Ø#×2Ñ2°>ÐBÀ#Àd×FVÑFVÐW\ÐE]ð_õ	
r"   c           	      ór   • SU R                    SU R                   SU R                  S SU R                  S 3$ )u(   RepresentaciÃ³n en string de la entrada.zEntrada z (DMAC: u   ) - PerÃ­odo: r+   rW   r-   )r   r   r   r   rC   s    r   Ú__str__ÚEntrada.__str__½   sH   € ð �t—‘Ð' x°·	±	¨{ð ;Ø×,Ñ,¨^Ð<¸CÀ×@PÑ@PÐQVÐ?WðYð	
r"   )
r   r   r   r   r   r   r   r   r   r   )N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r    r   r6   r@   r=   r>   rT   rY   r\   Ú__static_attributes__rG   r"   r   r
   r
      s8   † ñò$ò 
ò (òT
ò0	IòPò
Fô
õ<
r"   r
   )rb   r   r   ÚloggingrN   Úconfig.settingsr   r   r   Ú	getLoggerr^   r/   r
   rG   r"   r   Ú<module>rg      s7   ðñ÷ )Û Û ß BÑ Bà	×	Ò	˜8Ó	$€÷r
ò r
r"   