U
    ^¨jyX  ã                   @   s
  d dl mZ d dlmZ d dlmZ zd dlmZ W n  ek
rT   d dlmZ Y nX d dlmZ e edƒ¡Z	e
e	ƒ dd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Zd dlmZmZ ddlmZ dd„ Zd#dd„Zg ddddfdd„Zdd„ Zd$dd„Zd%eed œd!d"„ZdS )&é    )ÚMongoClient)Údatetime)Úpprint)ÚZoneInfoúAmerica/Santiagoc                 C   s   t | d›|d›|d›�ƒS ©NZ02©Úint)Ú	region_idÚarea_idÚ	centro_id© r   ú2/var/www/itgmanager/itgmanager/nanoox/save_data.pyÚgenerate_centro_id   s    r   c              
   C   sæ   z¤|d }|  ddi¡}|sBdi i i i dddddœdœ}| |¡ |  ¡  ¡ } | || krh|| |  W S |d | d }||| | < ||d |< | ddi|¡ |W S  tk
rà } ztd	|› d
|jj› d�ƒ W 5 d}~X Y nX dS )zƒ
    nombre: string (ej: 'LosLagos')
    tipo: uno de 'clientes', 'regiones', 'areas', 'centros'
    db: MongoClient().your_db
    Z	catalogosÚ_idZmapas_idr   )ÚclientesÚregionesÚareasÚcentros)r   r   r   r   r   Úcontadorr   é   úError z (line ú)N)	Úfind_oneÚ
insert_oneÚstripÚlowerÚreplace_oneÚ	ExceptionÚprintÚ__traceback__Ú	tb_lineno)ÚnombreÚtipoÚdbÚcolÚdocZnuevo_idÚer   r   r   Úget_or_create_id!   s4    üú
r(   c                 C   s@   t | ƒ}t |ƒ}t |ƒ}t |ƒ}t |d›|d›|d›|d›�ƒS r   r   )ÚmoduloZ	aviot_idxÚcan_idxÚ	bomba_posÚmÚaÚcÚbr   r   r   Úgenerate_numeric_idM   s
    r0   c              
   C   s4  zò|d |  d¡dœ}|  |¡}|d krX|  |¡ td|  dd¡ ¡ › dt|ƒ› �ƒ n˜d|krÊ|  dd	¡}|  |d
d|ii¡}|jr¬td|  dd¡ ¡ › dt|ƒ› �ƒ qðtd|  dd¡ ¡ › d�ƒ n&td|  dd¡ ¡ › dt|ƒ› d�ƒ W n< tk
�r. } ztd|j	j
› d|› �ƒ W 5 d }~X Y nX d S )Nr   r   ©r   r   u   ðŸŸ¢ Insertado r#   Ú Ú Úcontrol_versionr   z$setu(   ðŸŸ£ Campo 'control_version' agregado a u   ðŸŸ  No se modificÃ³ u+   , ya tenÃ­a el campo o coincidÃ­a el valor.u   ðŸŸ¡ z% ya existe y tiene 'control_version'.u2   â�Œ Error en insert_metadata_si_no_existe: lÃ­nea u    â€” )Úgetr   r   r   ÚupperÚ_id_centro_stringÚ
update_oneÚmodified_countr   r    r!   )Ú
collectionr&   ÚfiltroÚexisting_docZcontrol_version_valueÚresultr'   r   r   r   Úinsert_metadata_si_no_existen   s$    

&
þ&*r>   c                 C   s   | d › d|   dd¡› d�S )Nr   z (r   zsin centro_idr   )r5   )r&   r   r   r   r7   �   s    r7   )Ú	timedeltaÚtimezoner   )Úas_boolc                 C   s   |   |¡}d S ©N)r   )r:   Ú	documentoÚresr   r   r   Úinsertar_dato_timeseries˜   s    rE   Nc                    sˆ  ˆ   d¡\}}}|› d�}	| |	 }
‡ fdd„}t| ¡ ƒ}t| ¡ ƒ}t| ¡ ƒ}|d }ˆ d k	r‚||ƒ}||ƒ}||ƒ}||ƒ}|
jˆ r”dˆ dœnddiˆ rªd|ˆ d	œnd|d
œdd� |
jˆ rÌdˆ dœnddiˆ râd|ˆ dœnd|dœdd� |
jˆ �rdˆ dœnddiˆ �rd|ˆ dœnd|dœdd� |
jˆ �rBdˆ dœnddiˆ �rZd|ˆ dœnd|dœdd� tˆ �r~dˆ › d�ndƒ d S )NÚ-Z_estructura_logicac                    s   | D ]}ˆ |d< q| S )Nr   r   )Z
lista_docsr&   ©r   r   r   Úagregar_centro_id©   s    
z7actualizar_estructura_logica.<locals>.agregar_centro_idÚbombasÚmodulosr1   r   )r   rJ   r   )r   rJ   T)ÚupsertÚaviots)r   rL   r   )r   rL   Úcans)r   rM   r   )r   rM   )r   rI   r   ©r   rI   z"Estructura logica actualizada con Ú.zEstructura logica actualizada.)ÚsplitÚlistÚvaluesr   r   )r$   Ú
modulo_mapÚ	aviot_mapÚcan_mapÚ
bombas_docr   ÚregionÚareaÚcentroZestructura_col_nameZestructura_colrH   rJ   rL   rM   rI   r   rG   r   Úactualizar_estructura_logica    sD    
ù	ù	ù	ù
rZ   ÚPSFc           +      C   sÞ  t dƒ z| d¡\}}}	W n: tk
rV }
 zt d|
› d|
jj› �ƒ W 5 d }
~
X Y nX t |d¡}t |d¡jtj	d�}�z |	› d�}|	› d�}|	› d	�}|	› d
�}| | }| | }| | }| | }||  
¡ krè| j|ddddœd� ||  
¡ k�r| j|ddddœd� ||  
¡ k�r0| j|ddddœd� i i i   }}}dg dœ}|D �]”}	t|	d dd�D �]z\}}z8|d }|d }|d }| d¡d }t|||dƒ}W nF tk
�rì }
 z&t d|
› d|
jj› �ƒ W Y ¢�qdW 5 d }
~
X Y nX |d|||d |||dœ} |�r|| d < t|| ƒ | d!¡}!||| d"¡| d#¡|!| d$¡| d%¡| d&¡|||d d'œ}"|�rv||"d < t||"ƒ | ||d(|› �g d)œ¡ ||| d* k�r¾|| d*  |¡ | ||||g d+œ¡ ||| d k�rø|| d  |¡ | ||||g d,œ¡ t|d dd�D ]¾\}#}$t||||#ƒ}%|%d-||||#|$ d.¡|$ d/¡||d0œ
}&|�rh||&d < t||&ƒ |$ ¡ }'|' ||%|!d1œ¡ |�rš||'d < t||'ƒ || d  |%¡ |d  |%|$ d.¡|$ d/¡|d2œ¡ �q�qd�qNzt| |||||ƒ W n< tk
�r8 }( zt d|(› d|(jj› �ƒ W 5 d }(~(X Y nX |D ]Z\})}*zt| ||)|*ƒ W n< tk
�r” }
 zt d|
› d|
jj› �ƒ W 5 d }
~
X Y nX �q>W n< tk
�rØ }
 zt d3|
jj› d|
› �ƒ W 5 d }
~
X Y nX d S )4Nz en guardar_estructura_en_mongodbrF   r   r3   ú%Y-%m-%d %H:%M:%S©ÚtzinfoÚ	_metadataZ	_sensoresZ_cansZ_generador_timeseriesÚ	timestampÚbomba_idÚseconds)Ú	timeFieldÚ	metaFieldÚgranularity)Ú
timeseriesÚcan_idÚgenerador_idrI   rN   rM   r   )ÚstartZ	ipAddressÚaviotr)   rO   éÿÿÿÿr   z en Úcan)r   r#   r)   Úip_aviotrl   Úip_canÚcontrolr4   r   ÚpresionÚvoltajeÚ	corrienteÚsalÚestadoÚsource)r`   rg   rq   rr   rp   rs   rt   ru   r)   rj   rl   u   MÃ³dulo )Ú	modulo_idr"   rL   rL   )Úaviot_idÚiprv   rM   )rg   rx   rw   rI   Úbombar"   Úalias)
r   r#   r)   rm   rn   Zposicionr"   rz   ro   r4   )r`   ra   ZPresion)ra   r"   rz   rg   z.Error en guardar_estructura_en_mongodb: linea )r   rP   r   r    r!   r   ÚstrptimeÚreplacer@   ÚutcÚlist_collection_namesÚcreate_collectionÚ	enumerater0   r>   r5   rE   Ú
setdefaultÚappendÚcopyÚupdaterZ   Ú_save_one_generator_data)+r$   ÚdataÚgenerators_datar   ro   Únew_versionr`   rW   rX   rY   r'   ÚdtZformatted_timestampÚmetadata_col_nameZsensores_col_nameZcans_col_nameZgenerador_ts_col_nameÚmetadata_colZsensores_ts_colZ
can_ts_colZgenerador_ts_colrS   rT   rU   rV   r*   rl   rn   rm   r)   Zaviot_indexrg   Zcan_metadataZcan_pressureZ
can_ts_docr+   ry   ra   Zbomba_metadataZbomba_ts_docZerÚgenerator_nameÚgenerator_datar   r   r   Úguardar_estructura_en_mongodbâ   sì    
*





÷ 

õ 
üõ 
ý 
ü*2rŽ   c                 C   s$   |   d¡|   d¡t|   d¡ƒdkfS )aì  
    Clave que decide si un snapshot aporta informacion nueva.

    Comparar solo STATE descartaba la transicion entre linea principal ("110")
    y respaldo ("011"): con control por falla activo ocurre sin que STATE
    cambie, y es justo el evento que este contrato viene a comunicar.

    control_generator_back entra en la clave para que un cambio de modo quede
    registrado. Ausente y False se normalizan al mismo valor, asi que pasar de
    "no reportado" a False no genera fila.
    ÚSTATEÚdigital_outputs_stateÚcontrol_generator_backT)r5   rA   )Úsnapshotr   r   r   Ú_comparison_key™  s    ýr“   c           
   
   C   s   t dƒ zÖ|rt|tƒs,t d|› �ƒ W d S tdd„ | ¡ D ƒƒrVt d|› �ƒ W d S | d¡}t|ƒ}||d< t|ƒ}| ||dœ¡ |jd|id	d	d	d
dœdgd�}|rÊt	|ƒt	|ƒkrÊt dƒ W d S | 
|¡ t dƒ W n< tk
�r }	 zt d|	› d|	jj› �ƒ W 5 d }	~	X Y nX d S )Nzen _save_one_generator_datau/   La informaciÃ³n sobre generador no es vÃ¡lida: c                 s   s   | ]}|d kV  qd S rB   r   )Ú.0Úvaluer   r   r   Ú	<genexpr>²  s     z+_save_one_generator_data.<locals>.<genexpr>u0   Todos los datos sobre generador son invÃ¡lidos: r`   )Úgenerador_namerh   r—   r   r   )r�   r�   r‘   r   )r`   rk   )ÚsortzGSnapshot sin cambios (STATE/salidas/control por falla) -> no se guarda.u=   Nuevo documento insertado (cambiÃ³ la clave de comparaciÃ³n).r   u    en lÃ­nea )r   Ú
isinstanceÚdictÚallrR   r5   Ú_to_utc_datetimer„   r   r“   r   r   r    r!   )
r$   Zgenerators_colrŒ   r�   r   Zreceived_timestampZparsed_to_isodate_timestampZgenerator_docr<   r'   r   r   r   r…   ¬  s8    
þý
r…   )Úlocal_tzÚreturnc                 C   s¤   t | tƒr(| jdkr| n|  t|ƒ¡}nNt | tƒrdzt | ¡}W qv tk
r`   t | d¡}Y qvX nt	dt
| ƒ› �ƒ‚|jdkr’|jt|ƒd�}n|}| tdƒ¡S )zØ
    Convierte un timestamp (str o datetime) a datetime UTC timezone-aware.
    Acepta:
      - datetime con o sin tz
      - string "%Y-%m-%d %H:%M:%S"
      - string ISO8601 con tz: "2025-10-02T18:57:11+00:00"
    Nr\   z"Tipo no soportado para timestamp: r]   ÚUTC)r™   r   r^   Ú
astimezoner   ÚstrÚfromisoformatÚ
ValueErrorr{   Ú	TypeErrorÚtyper|   )Útsr�   Zdt_naiveZdt_localr   r   r   rœ   Û  s    


rœ   )N)N)r   )Úpymongor   r   r   Úzoneinfor   ÚImportErrorZbackports.zoneinfoÚnowr‰   r   r   r(   r0   r>   r7   r?   r@   Zgenerator_outputsrA   rE   rZ   rŽ   r“   r…   r¡   rœ   r   r   r   r   Ú<module>   s.   ,!!
B 8
/