ó
    ¥ 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                   óL   • \ 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R                  [        -  [        -  SSS9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 )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       Ú1/var/www/blue/EV-Temp_rev04/src/models/entrada.pyÚ__init__ÚEntrada.__init__   s•   € Ø$ŒØŒ	ð +×2Ñ2Ø ×'Ñ'Ô+;Ñ;Ô?OÑOØØð 3ð 
ˆÔð
  ×.Ñ.´ÔCSÑ1TÑTˆÔð  !ˆÔÜ! &›MˆÔÜ! %›LˆÔØˆŒØ#$ˆÔ Ø#ˆÕó    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    ÚvalorÚfechas      r"   Úagregar_medicionÚEntrada.agregar_medicion,   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    r6   r9   s      r"   Úget_estadisticasÚEntrada.get_estadisticasV   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_promedion   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Úxr6   s     €r"   Ú	<genexpr>Ú%Entrada.get_desvio.<locals>.<genexpr>„   s   øé € ÐM¹_¸ ™d X™o°!Ö3º_ùs   ƒr*   )Úlenr   r:   Úsumr<   ÚmathÚsqrt)r    Úsuma_cuadradosr6   s     @r"   r;   ÚEntrada.get_desvioy   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           	      óR  • Uc  U R                   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+   r0   r   )r    r!   s     r"   Úreiniciar_periodoÚ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   • 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'   rT   r)   )r   r   r   r   r@   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#   r3   r=   r:   r;   rQ   rU   rX   Ú__static_attributes__rD   r%   r"   r
   r
      s3   † ñò$ò((òT
ò0	IòPò
Fô
õ6
r%   r
   )r^   r   r   ÚloggingrK   Úconfig.settingsr   r   r   Ú	getLoggerrZ   r+   r
   rD   r%   r"   Ú<module>rc      s7   ðñ÷ )Û Û ß BÑ Bà	×	Ò	˜8Ó	$€÷c
ò c
r%   