From 3fe04234eaf56e778343d362df7bf7e0acaafadb Mon Sep 17 00:00:00 2001 From: egutierrez Date: Sat, 30 Nov 2024 00:16:36 +0100 Subject: [PATCH] Implement Open-Meteo API integration and MongoDB storage for weather data --- __pycache__/open_meteo_auto.cpython-312.pyc | Bin 0 -> 4100 bytes __pycache__/openweatherMap.cpython-312.pyc | Bin 0 -> 4015 bytes open_meteo_auto.py | 81 ++++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 __pycache__/open_meteo_auto.cpython-312.pyc create mode 100644 __pycache__/openweatherMap.cpython-312.pyc create mode 100644 open_meteo_auto.py diff --git a/__pycache__/open_meteo_auto.cpython-312.pyc b/__pycache__/open_meteo_auto.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5206eea305d5904bcb5d005f1b418a246e9226ac GIT binary patch literal 4100 zcmbtXU2GHC6~5#7@z}BBB)0QI2yw`kjoXd01iGs=KOrH3X2}mNRDc(0cH)_samF5V zXG}JhL$lRNo2U=$s+HJkLEWk^wD7P}AIc-JFGzivG^ygwf{N6>v`?mV+ls#Q+_A?t zkUVvi+0<4JgInNqz8FU;rEri?G)v-{ktKjTmMDda-3 z`*w9ZyX8&qc8*c6C0_E}c2(Mm0Ib=5mRD-3&1#W+iB_4F{2w7lf1(ZA%?<6K%t(QT zc1R9OEeit(;So8M9<1;0NU(DU{QKn2+i)}FOAlA-#?l#+TJN+u=ShFJaYjX!f>KBd zOYJvYQpcUn+jOOuLQB*V747;PY0g9`t7%%xrnKX#B4>@L%VOqLZP8*3QC}c~swPT; zq#1Jd3N)KjvLWDnR#3H6O2*K`oED8sQ1g;#$cB=UEzk7q%*k2dhd-Ds?8*?;(p-FK zNY#>}dP&ob`0(3r?tgp8a*vM*Go#ZJmTyr86*3k;gJ}5;Mb6|jVJe@Lv6iepihXqA zHpGZ$W47BE)hj}^2UvC$UFoWs_KIpDQAPAQI9HMS9NlD`>jOujm+2xZQW7Jv5_f}H zW<1DXot0_Mk?M7kE;4uA&ZRH2MK1)<$Dd`UCSKo5O8|xwd5^wV5_UH`Nv3VTIQ~Di_{|efWCkhsi-eM3oDLmSv{{B zVnh`qqo*e$k{p@M$=Sha*^sqJPQ+qFn}g?uuZqLw#*ydT8xd8@9x3d*WEeReoJPzkF^wE1Lk<&5 zYMG%c`-kQ=EGI?XI9u>f#)_GLJDhw@`I7izj|s z(6Tc4Ek{n1(eq<)?D1FZgN>9qMIu&fpd)FB8Biowu4OwDs963r&@_Ruh9jc7^VP*8 zGf^HBm$n!sJFi(hmM`aJ-Ow!>KxVaIQPE`qY!!4vH1fK|q;)N8c_uzc$~i*;k(J3V zQMcu;S`Fq`jkdT7KrK3tRU9I_fPOs(Z!KGttdo5smGAjm6Y-0uv9<)(=@-ER1WCCf zW7s=MJR@W8b&l;JxP0&mOl}|u|N8HsSV8~fQ1k8$ zf6vN^665{&)Q6|cw(mXcc<3>|f6hGrzIjeGTjn;IWXU_ca{NiCyA~pitkAmIT4}W_23;NcH&ESDmzQng|@qO!j-zMK*;+wBEtu>kL=gkZ6o99JS zOqrK*X6mwe8Ji(}lQ&9%j%&+n%Rl*%$?y5kqo&Y5kc(|5%Y17-v*Xa+(YpuC@W>{A zti=2OTV`SKx!wt9zcboAdI;S=^w-c` zndcB=eJ%mF&jvSc2b(Z)4@_PQ6Lz-($7iReCXSz-oSm^lASN-y;_^l^3!&Gm07$VR z06$qx6fOuebycZ@lA|CgX zRc+P73k2AeFpb}Y0Z31f{u?N^18&RUCKD^WngEckyKh|BXnlQ^EBS*zJGmyTx=P`W z8-exkz^eDJJ>U9;@N;3KC$`G2F0AvrO0C^nt^3wn_kEGyXdQ$#4rJfCyKgH#wH}`` z-@c@;X3;NQ;0^~l2oFW8qfyeSoOeTeR*jkG_vY> z)DgWE-RL;D>Z`f@_`QqwX3Wr;Kk{c^_3y!3;;l1gc>g9p+~D7YAb<6p(Ez$1@Qe=A z_dCO*gY^AD7G#STgp8Z(71)qYOH3y?<$xujr_G=tMXAi1$`uK(4Rn2 zrYVa08U-Gs-an%~kICP+zeb+NsPi%EdCDWo_mRKMA%FYo*tN;E$xjx{{*eveu@z6r z8(iIcExH!{Wb(7C8{XK8yVTaV5_m$fPhD+P^D`Q`xH6H-10X$h1!{dDmG|0x-dZ0> z<=u$!trq@3ca@mn7Sp@V^!_Q(_UXaT_@5r#3J$CX2Q~uHQt-Vpi`d9BM6=w#Ipp?# jIA8MjmU;)ioL>(fDRm5$-O%|BV%%KWgP2|T6d3tG2o4m4 literal 0 HcmV?d00001 diff --git a/__pycache__/openweatherMap.cpython-312.pyc b/__pycache__/openweatherMap.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa9ec3e929ef63b698d58a5b37fef9ed08a6312a GIT binary patch literal 4015 zcmb_fUu+Y}8K3>@^}jfY?HC9L%Y_Dfci4r4Qc?ss!Egcc=MGv*gtXdtH(|rt>ziF) zE|EiX)k#fs4}e+;s)EGb6BV@2c?{Q=N_}yfRB`t}J+)7LGo@84Dpmbv*K0eFRI1ul zJUctzH#6VN{C>Z0@|$otfZ%!W%(=<)L4^K9KD@_Que|srh0qLu=X4?OAM-nPN)L<$z@OKH`OsL1LNro+kLpu6UxBF| z-qg*v;(G+MlV_|AdTj0^DE>!u-7B)CS3n6iyxO<)3Mt`+SBJ_eZJ#19%CS!Pj3sHz?H?K$K06|P z_k+RN9eFZ`GTxU?>qbu2uNkJ*cj)Lh4<1e1zSI5EaAqiLho)5+OU05RTe2M)7`bpE zJ8)@mWY{%FawUu*Myc+Ws~@|wEDlPtz!xVRC|V7hcQkWUnVPC^fzzX2C{!8!4Be-_ zEd?mjb95P5tmmaL3afDU*g3|JED!Q%O7QH>cbP6Tk9qGv=GZbj1(bR9@gkzo77_VK zM2c{qX~qO2gS%ec66;&K5s)ft$84bxru_$9%G{ylMDi-0)3{%YMTK-p` zTUrk4(4kb2#hg}BWF=KfwTxL%j7>T?qO5Pd{629w>Bj^vHmemT4D2UW0jnRD zR1<<>fJt^cmNiqAz$%%RY?UC!Dbpy}{_Mv&wPef>0IO*M&VR!k#su zrz*7F3@!#MUD@S{wR?(%c4N{vs31979iz`TKV=U()gZ1oLHrgZlqVJ(?T^bs#F_ zJQg_y=ke^IDYVtljO}2XW6F%>Bv<0-v=GJEgy&_{7=`e9GZmxD+*CsWoQa)cBiA?g zanz&T>*J^g53@wQmgZYw%KXL=K|R&4!@e5QVXJ!Zcg{7 zX1iU#rWmvudt7EtIztgQHjO~cf;e~@1fr+GL)Xufp{6gPVZfmwCTPH9?=abPOq3au z&9(y?a0gqGQBdumTUQlHQ}7$aWfv4lpUpWd!6NCv11CTeY+4z&135$2fnkKJJXVQh z;vR4^3H4nfikL`--C2)OQVUW&9bzJi`-t~Xq1cR3?FZJ_RE-AeJnh(d@5*Y&z6HJ- zj{fBAqO?F)|NL8L#zdhVeAB@MUIsf7S^GX<9$ zNgJrN6)l*JfSq9>RW@kofSrZDo1|#~JG-&319tWXy8-Mc&*-HoLo8ygkkg8g5kTJw zKtW(tFLlm9rpU`V6|$krhbBH#v%P}_EvLzZ1*$FlyxR+2vNSbcG^Cc?g2^rRDEv$dip`MT`R%2yCCD9_HMYM-^8onRI}g9N z8auq;f0{@>Os*ylFN7MnKD~T(dAJh0_&ed!>mWYxP=0u^5m9BKh^0w#X&Rwjs^ z1pS#5^CT9}B$+2k4(hfbNqJc-NYd>4*}k-wG}Buo&2-Dc+@#s}AC?YxYTh(TIH%eH zPz^j&G&B&8-T{)bCrg@h-`$XCH*6d^44WU46%03-uFD3#4mn&Z<|K<;PoxW_oNOi; zn=QaS#SS=E8`T0AyKNeLrJ`Zz60s$_G08EuuQ=nVk0XWfh1Cg=FU*1slLNJR_qLBo z3bP}1dy3pTw8Er&qoEBGdctL0*Tyknlg-0*2L45GZaJ^$t8;B|K}JA8_L{^aNp^4o z8+oa|H;idvVw=!(Vk4I{qOrW97IkCh=ja9WMGnwj3di$?Qqt8E_&l_ctG@X!C~6Ev zQD33RGqn2;XxB6H_tsa){|s$=&Lb-HX}HFtgm`QGj&@tCh(}htzEwfdYAC+Ye{*ng z@YeN8&&k!$sd;}j5M6llW^yrkYw+%k)j(?ASMBV+_2!-A?PO)=flB(+YG-CX@-@Xh zr#q>(7Yw5L8mZOxL+v>oZnQzIw##V?G}@pBZER>^_P5OTD!Y4~eS3v{`}dK~+lTK8 zKR&S@-MpMYHa7-YnAA}Y9d|pLF3;L>*H&F L#O}c7U<>{Y4dUti literal 0 HcmV?d00001 diff --git a/open_meteo_auto.py b/open_meteo_auto.py new file mode 100644 index 0000000..24aafc1 --- /dev/null +++ b/open_meteo_auto.py @@ -0,0 +1,81 @@ +import requests +from pymongo import MongoClient +from prefect import flow, task +from dotenv import load_dotenv +from prefect.logging import get_run_logger +import os +from pathlib import Path +from datetime import datetime + + +# Cargar variables de entorno desde el archivo .env +load_dotenv() + +# Configuración para la API de OpenWeatherMap y MongoDB +MONGO_URI = os.getenv("MONGO_URI", "mongodb://localhost:27017/") +DB_NAME = os.getenv("DB_NAME", "weather_data") +COLLECTION_NAME = "tiempo_Lucero" + +@task +def obtener_datos_climaticos(latitud, longitud): + """Consulta la API de Open-Meteo para obtener datos climáticos de una ubicación.""" + logger = get_run_logger() + logger.info(f"Consultando datos climáticos para la ubicación: lat={latitud}, lon={longitud}") + url = "https://api.open-meteo.com/v1/forecast" + params = { + "latitude": latitud, + "longitude": longitud, + "current_weather": True, + "timezone": "Europe/Madrid" + } + try: + response = requests.get(url, params=params) + response.raise_for_status() + logger.info(f"Datos climáticos recibidos correctamente para la ubicación: lat={latitud}, lon={longitud}.") + return response.json() + except Exception as e: + logger.error(f"Error al obtener datos climáticos: {e}") + raise + +@task +def guardar_en_mongodb(datos): + """Guarda los datos recibidos en MongoDB.""" + logger = get_run_logger() + logger.info("Guardando datos en MongoDB.") + try: + client = MongoClient(MONGO_URI) + db = client[DB_NAME] + collection = db[COLLECTION_NAME] + # Añadir una marca de tiempo a los datos + datos["timestamp"] = datetime.utcnow() + result = collection.insert_one(datos) + logger.info(f"Datos guardados en MongoDB con ID: {result.inserted_id}") + return result.inserted_id + except Exception as e: + logger.error(f"Error al guardar datos en MongoDB: {e}") + raise + +@flow +def open_meteo_auto(latitud, longitud): + """Flujo principal que consume la API y almacena datos en MongoDB.""" + logger = get_run_logger() + logger.info(f"Iniciando el pipeline para la ubicación: lat={latitud}, lon={longitud}") + try: + datos_api = obtener_datos_climaticos(latitud, longitud) + id_insertado = guardar_en_mongodb(datos_api) + logger.info(f"Pipeline completado. Datos insertados con ID: {id_insertado}") + except Exception as e: + logger.error(f"Error en el pipeline: {e}") + raise + + +# Configura y despliega el flujo +if __name__ == "__main__": + open_meteo_auto.from_source( + source=str(Path(__file__).parent), # Código almacenado en el directorio local + entrypoint="E:/Proyects/API_diverse_consumption/open_meteo_auto.py:open_meteo_auto", + ).deploy( + name="OpenMeteo_Lucero", + parameters={"latitud": 40.391889, "longitud": -3.745}, # Coordenadas de Lucero, Madrid (decimales) + work_pool_name="Workers_pc_torre_Lucas" + )