feat(app): verbeter parallelle data-ophaling en error handling

Het aantal workers voor de ThreadPoolExecutor is verhoogd van 3 naar 5 om de uitvoering te verbeteren. Nieuwe data-ophaalfuncties zijn toegevoegd, inclusief error handling met fallback-opties. De index methode gebruikt nu fetch_data_parallel voor efficiëntere API-calls en fouttolerantie. Dit verbetert de algehele responsiviteit en stabiliteit van de applicatie.
This commit is contained in:
filoor 2025-05-29 21:40:20 +02:00
parent d378511401
commit c3342496dd
2 changed files with 90 additions and 58 deletions

View File

@ -5,7 +5,7 @@ from config import *
from hijridate import Gregorian
from functools import lru_cache
import time
from concurrent.futures import ThreadPoolExecutor
from concurrent.futures import ThreadPoolExecutor, as_completed
app = Flask(__name__)
@ -13,7 +13,7 @@ app = Flask(__name__)
CACHE_DURATION = 300 # 5 minuten cache voor API calls
last_api_call = {}
cached_data = {}
executor = ThreadPoolExecutor(max_workers=3) # Voor parallelle API calls
executor = ThreadPoolExecutor(max_workers=5) # Verhoogd naar 5 workers voor betere parallelle uitvoering
def get_cached_data(key, fetch_func, duration=CACHE_DURATION):
"""Haal data uit cache of voer fetch_func uit als cache verlopen is"""
@ -29,13 +29,70 @@ def get_cached_data(key, fetch_func, duration=CACHE_DURATION):
return data
def fetch_data_parallel():
"""Haal alle data parallel op"""
"""Haal alle data parallel op met verbeterde error handling"""
futures = {
'weather': executor.submit(fetch_weather_data),
'sonos': executor.submit(fetch_sonos_zones),
'date': executor.submit(get_date_info)
'date': executor.submit(get_date_info),
'hadith': executor.submit(load_hadith),
'prayer_times': executor.submit(fetch_prayer_times)
}
return {key: future.result() for key, future in futures.items()}
results = {}
for key, future in futures.items():
try:
results[key] = future.result(timeout=5) # Timeout van 5 seconden per request
except Exception as e:
print(f"⚠️ Fout bij ophalen {key} data: {e}")
results[key] = get_fallback_data(key)
return results
def get_fallback_data(key):
"""Geef fallback data terug als API calls falen"""
fallbacks = {
'weather': {
'temperature': '--',
'feels_like': '--',
'description': 'Weer niet beschikbaar',
'humidity': '--',
'wind_speed': '--',
'icon': '01d'
},
'sonos': ['Woonkamer'],
'date': get_date_info(), # Gebruik lokale functie als fallback
'hadith': {
"text": "De daden die Allah het meest liefheeft zijn degenen die regelmatig worden verricht, zelfs als ze klein zijn.",
"bron": "Sahih al-Bukhari"
},
'prayer_times': {
"Fajr": "06:00",
"Zuhr": "12:30",
"Asr": "15:00",
"Maghrib": "17:30",
"Isha": "19:00"
}
}
return fallbacks.get(key, {})
@lru_cache(maxsize=1)
def fetch_prayer_times():
"""Haal gebedstijden op met caching"""
try:
res = requests.get(VUMG_API, timeout=5)
res.raise_for_status()
data = res.json()[0]
return {
"Fajr": data.get("fajr_jamah", "00:00")[:5],
"Zuhr": data.get("zuhr_jamah", "00:00")[:5],
"Asr": data.get("asr_jamah", "00:00")[:5],
"Maghrib": data.get("maghrib_jamah", "00:00")[:5],
"Isha": data.get("isha_jamah", "00:00")[:5]
}
except Exception as e:
print(f"⚠️ Fout bij ophalen gebedstijden: {e}")
return get_fallback_data('prayer_times')
# Voeg cache-control headers toe voor statische bestanden
@app.after_request
@ -274,62 +331,36 @@ def get_date_info():
@app.route('/')
def index():
settings = load_settings()
# Haal alle data parallel op
data = fetch_data_parallel()
# Verwerk gebedstijden
gebedstijden = apply_prayer_offsets(data['prayer_times'], settings)
# Bepaal volgende gebed
now = datetime.now().strftime('%H:%M')
next_time = "Onbekend"
next_name = "Onbekend"
debug_data = {}
gebedstijden = {}
hadith = load_hadith()
weather = fetch_weather_data()
date_info = get_date_info()
try:
res = requests.get(VUMG_API)
res.raise_for_status()
data = res.json()[0]
for naam, tijd in gebedstijden.items():
if tijd > now:
next_time = tijd
next_name = naam
break
else:
next_time = list(gebedstijden.values())[0]
next_name = list(gebedstijden.keys())[0]
gebedstijden = {
"Fajr": data.get("fajr_jamah", "00:00")[:5], # Haal seconden weg
"Zuhr": data.get("zuhr_jamah", "00:00")[:5], # Haal seconden weg
"Asr": data.get("asr_jamah", "00:00")[:5], # Haal seconden weg
"Maghrib": data.get("maghrib_jamah", "00:00")[:5], # Haal seconden weg
"Isha": data.get("isha_jamah", "00:00")[:5] # Haal seconden weg
}
# Pas offsets toe op gebedstijden
gebedstijden = apply_prayer_offsets(gebedstijden, settings)
now = datetime.now().strftime('%H:%M')
for naam, tijd in gebedstijden.items():
if tijd > now:
next_time = tijd
next_name = naam
break
else:
next_time = list(gebedstijden.values())[0]
next_name = list(gebedstijden.keys())[0]
debug_data = {
"api_response": data,
"gebedstijden": gebedstijden,
"now": now,
"next_time": next_time,
"next_name": next_name
}
except Exception as e:
print("❌ Fout bij ophalen/verwerken van gebedstijden:", e)
dua = "اللّهُمَّ اجْعَلْ صَلاتِي نُورًا"
return render_template('index.html',
next_time=next_time,
next_name=next_name,
dua=dua,
hadith=hadith,
gebedstijden=gebedstijden,
debug=debug_data,
settings=settings,
weather=weather,
date_info=date_info)
next_time=next_time,
next_name=next_name,
dua="اللّهُمَّ اجْعَلْ صَلاتِي نُورًا",
hadith=data['hadith'],
gebedstijden=gebedstijden,
settings=settings,
weather=data['weather'],
date_info=data['date'])
@app.route('/instellingen', methods=['GET', 'POST'])
def instellingen():

1
done
View File

@ -78,3 +78,4 @@ Wed May 28 14:02:31 CEST 2025: Debug tijd synchronisatie toegevoegd tussen debug
2025-05-29 17:03:53 - Chrome translate banner uitgeschakeld: --disable-translate, --disable-features=Translate, --lang=nl flags toegevoegd aan beide setup scripts
2025-05-29 17:07:38 - Browser gewijzigd van Chromium naar Puffin: 4x sneller, 80MB minder RAM, cloud rendering voor betere Pi3 prestaties
2025-05-29 17:28:00 - Terug naar Chromium: Puffin werkte niet goed op Pi32025-05-29 21:32:16 - Geoptimaliseerde index.html en adzkaar.html voor betere performance
2025-05-29 21:39:45 - App.py geoptimaliseerd: verbeterde parallelle data ophaling, caching en error handling toegevoegd