From ddd867eb00c436e1fe1767e3db5c5077eaf2e965 Mon Sep 17 00:00:00 2001 From: Alexander Berry-Roe Date: Sun, 11 May 2025 12:32:38 +0100 Subject: [PATCH] Add initial weather display application with API integration Includes weather data retrieval from Open-Meteo API and basic WiFi setup for connectivity. IntelliJ project configuration files and a `.gitignore` for IDE-specific files are also added. --- .idea/.gitignore | 8 +++ .../inspectionProfiles/profiles_settings.xml | 6 ++ .idea/modules.xml | 8 +++ .idea/vcs.xml | 6 ++ .idea/weatherDisplay.iml | 11 ++++ main.py | 44 +++++++++++++++ weather_requests.py | 55 +++++++++++++++++++ 7 files changed, 138 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/weatherDisplay.iml create mode 100644 main.py create mode 100644 weather_requests.py diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..1e58c1c --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/weatherDisplay.iml b/.idea/weatherDisplay.iml new file mode 100644 index 0000000..8c71c1d --- /dev/null +++ b/.idea/weatherDisplay.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..2a0c617 --- /dev/null +++ b/main.py @@ -0,0 +1,44 @@ +import network +import socket +import time +import weather_requests + + +# --- WiFi Connection Setup --- +SSID = 'octopod' # Replace with your WiFi SSID +PASSWORD = 'amniotic-duo-portfolio' # Replace with your WiFi Password + +#Set current location +latitude = 50.9097 +longitude = -1.4043 + + +station = network.WLAN(network.STA_IF) +station.active(True) +station.connect(SSID, PASSWORD) +print("Connecting to WiFi...") + + +timeout = 10 +start_time = time.time() +while not station.isconnected(): + if time.time() - start_time > timeout: + print("Failed to connect to WiFi. Check your SSID and password.") + break + time.sleep(1) + +if station.isconnected(): + ip = station.ipconfig("addr4") + time.sleep(1) + ipv6_addr = station.ipconfig("addr6") + print("Connected to WiFi! IPv4 address:", ip) + print("Connected to WiFi! IPv6 address:", ipv6_addr) +else: + print("WiFi connection not established. Restart and try again.") + raise SystemExit + + + +weather = weather_requests.get_daily(latitude, longitude) + +print(weather_requests.get_today_forecast(weather)) diff --git a/weather_requests.py b/weather_requests.py new file mode 100644 index 0000000..e195dbe --- /dev/null +++ b/weather_requests.py @@ -0,0 +1,55 @@ +import urequests as requests + +def get_hourly(latitude, longitude): + base_url = "https://api.open-meteo.com/v1/forecast" + query = ( + f"latitude={latitude}&" + f"longitude={longitude}&" + "hourly=temperature_2m,precipitation_probability,weathercode&" + "timezone=Europe%2FLondon" + ) + full_url = f"{base_url}?{query}" + + try: + response = requests.get(full_url) + if response.status_code == 200: + return response.json() + else: + print(f"Error: Status {response.status_code}") + print(response.text) + return None + except Exception as e: + print(f"Request failed: {e}") + return None + +def get_daily(latitude, longitude): + base_url = "https://api.open-meteo.com/v1/forecast" + query = ( + f"latitude={latitude}&" + f"longitude={longitude}&" + "daily=temperature_2m_max,temperature_2m_min,precipitation_sum,weathercode&" + "timezone=Europe%2FLondon" + ) + full_url = f"{base_url}?{query}" + + try: + response = requests.get(full_url) + if response.status_code == 200: + return response.json() + else: + print(f"Error: Status {response.status_code}") + print(response.text) + return None + except Exception as e: + print(f"Request failed: {e}") + return None + +def get_today_forecast(data): + daily = data["daily"] + return { + "date": daily["time"][0], + "max_temp": daily["temperature_2m_max"][0], + "min_temp": daily["temperature_2m_min"][0], + "precip_mm": daily["precipitation_sum"][0], + "weathercode": daily["weathercode"][0] + } \ No newline at end of file