Ueli-Badi-App / app.py
zurd46's picture
Update app.py
0042764 verified
raw
history blame
8.14 kB
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()