From c3342496ddc8a370241ce25974fc2efe682b70bc Mon Sep 17 00:00:00 2001 From: filoor Date: Thu, 29 May 2025 21:40:20 +0200 Subject: [PATCH] feat(app): verbeter parallelle data-ophaling en error handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- adhan-webapp/app.py | 147 +++++++++++++++++++++++++++----------------- done | 1 + 2 files changed, 90 insertions(+), 58 deletions(-) diff --git a/adhan-webapp/app.py b/adhan-webapp/app.py index 2981ee5..8d4f1bd 100644 --- a/adhan-webapp/app.py +++ b/adhan-webapp/app.py @@ -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] - - 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 = "اللّهُمَّ اجْعَلْ صَلاتِي نُورًا" + + 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] + 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(): diff --git a/done b/done index 5996268..2580fea 100644 --- a/done +++ b/done @@ -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