Spaces:
Sleeping
Sleeping
import gradio as gr | |
import openai | |
import requests | |
from bs4 import BeautifulSoup | |
import os | |
from datetime import datetime | |
import time | |
# OpenAI API Key aus Umgebungsvariablen | |
openai.api_key = os.getenv('OPENAI_API_KEY') | |
# Funktion, um aktuelle Wetterdaten zu holen | |
def get_current_weather_data(lat, lon): | |
api_key = os.getenv('WEATHER_API_KEY') | |
base_url = "http://api.openweathermap.org/data/2.5/weather?" | |
complete_url = f"{base_url}lat={lat}&lon={lon}&appid={api_key}&units=metric&lang=de&_={datetime.now().timestamp()}" | |
response = requests.get(complete_url) | |
if response.status_code == 200: | |
data = response.json() | |
print(f"API Antwort: {data}") # Ausgabe der gesamten API-Antwort zur Fehlersuche | |
return data | |
else: | |
print(f"Fehler beim Abrufen der Wetterdaten: {response.status_code}") | |
return None | |
# Funktion, um Wassertemperatur zu holen | |
def get_water_temperature(): | |
url = "https://www.badi-info.ch/_temp/ww/sursee.htm" | |
response = requests.get(url) | |
soup = BeautifulSoup(response.content, "html.parser") | |
water_temp_element = soup.find("b", {"id": "t5"}) | |
if water_temp_element: | |
return water_temp_element.text.strip() + "°C" | |
else: | |
return "Wassertemperatur nicht verfügbar" | |
# Funktion, um GPT-3.5 Turbo zu nutzen, um eine Badeempfehlung zu generieren | |
def get_bathing_recommendation_with_gpt(temp, feels_like_temp, humidity, wind_speed, weather_description, water_temp): | |
if water_temp == "Wassertemperatur nicht verfügbar": | |
return "Wassertemperatur nicht verfügbar. Keine Badeempfehlung möglich." | |
prompt = f""" | |
Hier sind die aktuellen Wetterdaten: | |
- Temperatur: {temp:.2f}°C | |
- Gefühlte Temperatur: {feels_like_temp:.2f}°C | |
- Luftfeuchtigkeit: {humidity:.2f}% | |
- Wetterbeschreibung: {weather_description} | |
- Windgeschwindigkeit: {wind_speed:.2f} m/s | |
- Wassertemperatur: {water_temp} | |
Basierend auf diesen Daten, ist es ein guter Tag zum Baden? Bitte gib eine Empfehlung ab. | |
""" | |
response = openai.ChatCompletion.create( | |
model="gpt-3.5-turbo", | |
messages=[ | |
{"role": "system", "content": "Du bist ein hilfreicher Assistent, der Empfehlungen basierend auf Wetterdaten gibt."}, | |
{"role": "user", "content": prompt} | |
], | |
max_tokens=256, | |
temperature=0.5 | |
) | |
recommendation = response.choices[0].message['content'].strip() | |
return recommendation | |
# Funktion, um Wetterdaten zu holen und Bericht zu erstellen | |
def get_weather(): | |
# Koordinaten für Seebad Eich | |
lat, lon = 47.1511104, 8.1662631 | |
current_weather_data = get_current_weather_data(lat, lon) | |
if current_weather_data: | |
temp = current_weather_data["main"]["temp"] | |
feels_like_temp = current_weather_data["main"]["feels_like"] | |
humidity = current_weather_data["main"]["humidity"] | |
wind_speed = current_weather_data["wind"]["speed"] | |
weather_description = current_weather_data["weather"][0]["description"] | |
print(f"Extrahierte Wetterbeschreibung: {weather_description}") # Ausgabe der extrahierten Wetterbeschreibung zur Überprüfung | |
water_temp = get_water_temperature() | |
recommendation = get_bathing_recommendation_with_gpt(temp, feels_like_temp, humidity, wind_speed, weather_description, water_temp) | |
weather_report = f""" | |
<!DOCTYPE html> | |
<html lang="de"> | |
<head> | |
<meta charset="UTF-8"> | |
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
<link rel="manifest" href="/manifest.json"> | |
<meta name="apple-mobile-web-app-capable" content="yes"> | |
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> | |
<meta name="apple-mobile-web-app-title" content="Wetterbericht Seebad Eich"> | |
<title>Wetterbericht Seebad Eich</title> | |
<style> | |
body {{ | |
font-family: Arial, sans-serif; | |
background-color: #333; | |
color: #fff; | |
margin: 0; | |
padding: 0; | |
width: 100%; | |
}} | |
.container {{ | |
width: 100%; | |
padding: 20px; | |
box-sizing: border-box; | |
}} | |
h2 {{ | |
text-align: center; | |
}} | |
table {{ | |
width: 100%; | |
border-collapse: collapse; | |
margin-top: 20px; | |
}} | |
th, td {{ | |
text-align: left; | |
padding: 8px; | |
}} | |
h3 {{ | |
margin-top: 40px; | |
}} | |
</style> | |
</head> | |
<body> | |
<div class="container"> | |
<h2>Wetterbericht Seebad Eich</h2> | |
<table> | |
<tr> | |
<th>Parameter</th> | |
<th>Wert</th> | |
</tr> | |
<tr> | |
<td>Temperatur</td> | |
<td>{temp:.2f}°C</td> | |
</tr> | |
<tr> | |
<td>Gefühlte Temperatur</td> | |
<td>{feels_like_temp:.2f}°C</td> | |
</tr> | |
<tr> | |
<td>Luftfeuchtigkeit</td> | |
<td>{humidity:.2f}%</td> | |
</tr> | |
<tr> | |
<td>Wetterbeschreibung</td> | |
<td>{weather_description}</td> | |
</tr> | |
<tr> | |
<td>Windgeschwindigkeit</td> | |
<td>{wind_speed:.2f} m/s</td> | |
</tr> | |
<tr> | |
<td>Wassertemperatur am Sempachersee</td> | |
<td>{water_temp}</td> | |
</tr> | |
</table> | |
<h3 style="margin-top: 40px;">Badeempfehlung</h3> | |
<p>{recommendation}</p> | |
</div> | |
</body> | |
</html> | |
""" | |
else: | |
weather_report = """ | |
<!DOCTYPE html> | |
<html lang="de"> | |
<head> | |
<meta charset="UTF-8"> | |
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
<link rel="manifest" href="/manifest.json"> | |
<meta name="apple-mobile-web-app-capable" content="yes"> | |
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> | |
<meta name="apple-mobile-web-app-title" content="Wetterbericht Seebad Eich"> | |
<title>Wetterbericht Seebad Eich</title> | |
<style> | |
body { | |
font-family: Arial, sans-serif; | |
background-color: #333; | |
color: #fff; | |
margin: 0; | |
padding: 0; | |
width: 100%; | |
} | |
.container { | |
width: 100%; | |
padding: 20px; | |
box-sizing: border-box; | |
} | |
h2 { | |
text-align: center; | |
} | |
p { | |
text-align: center; | |
} | |
</style> | |
</head> | |
<body> | |
<div class="container"> | |
<h2>Wetterbericht Seebad Eich</h2> | |
<p>Wetterdaten konnten nicht abgerufen werden. Bitte versuchen Sie es später erneut.</p> | |
</div> | |
</body> | |
</html> | |
""" | |
return weather_report | |
# Gradio-Interface ohne Input, direktes Ausführen bei Start | |
iface = gr.Blocks() | |
def update_weather(): | |
while True: | |
weather_report = get_weather() | |
iface.clear() | |
iface.HTML(weather_report) | |
time.sleep(3600) # Wartezeit von einer Stunde (3600 Sekunden) | |
with iface: | |
gr.HTML(get_weather()) | |
iface.launch() | |
update_weather() | |