From d74ba4c7996d624a76003bf04f3f8bbb4fb9f757 Mon Sep 17 00:00:00 2001 From: Floke Date: Sat, 5 Jul 2025 20:08:07 +0000 Subject: [PATCH] debug_screenshot.py aktualisiert --- debug_screenshot.py | 68 ++++++++++++++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 23 deletions(-) diff --git a/debug_screenshot.py b/debug_screenshot.py index b2e47faf..2ca3c4d5 100644 --- a/debug_screenshot.py +++ b/debug_screenshot.py @@ -2,6 +2,7 @@ import asyncio import os import logging from pyppeteer import launch +from pyppeteer.errors import TimeoutError # Logging-Konfiguration logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') @@ -9,48 +10,70 @@ logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %( # --- Konfiguration --- HA_URL = "http://192.168.178.131:8123/lovelace/solar?kiosk" OUTPUT_FILE = "/screenshots/debug_screenshot_final.png" -HA_TOKEN = os.environ.get("HA_ACCESS_TOKEN") + +# NEU: Anmeldedaten aus Umgebungsvariablen lesen +HA_USERNAME = os.environ.get("HA_USERNAME") +HA_PASSWORD = os.environ.get("HA_PASSWORD") async def main(): - if not HA_TOKEN: - logging.error("Fehler: Umgebungsvariable HA_ACCESS_TOKEN nicht gefunden!") + if not HA_USERNAME or not HA_PASSWORD: + logging.error("Fehler: HA_USERNAME oder HA_PASSWORD Umgebungsvariable nicht gefunden!") return - logging.info("Starte Puppeteer-Browser mit Ignorieren von HTTPS-Fehlern...") + logging.info("Starte Puppeteer-Browser...") browser = await launch( executablePath='/usr/bin/chromium', headless=True, - # === ENTSCHEIDENDE ÄNDERUNG: SSL-Fehler ignorieren === ignoreHTTPSErrors=True, - args=[ - '--no-sandbox', - '--disable-setuid-sandbox', - '--disable-dev-shm-usage' - ] + args=['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage'] ) page = await browser.newPage() await page.setViewport({'width': 1280, 'height': 1024}) - logging.info("Setze Authentifizierungs-Header...") - await page.setExtraHTTPHeaders({ - 'Authorization': f'Bearer {HA_TOKEN}' - }) - try: - logging.info(f"Navigiere zu URL: {HA_URL}") + logging.info(f"Navigiere zur initialen URL: {HA_URL}") await page.goto(HA_URL, {'waitUntil': 'networkidle0', 'timeout': 60000}) + await asyncio.sleep(3) # Warten, bis die Seite stabil ist + + # --- NEUE LOGIN-ROUTINE --- + # Prüfen, ob wir auf der Login-Seite sind, indem wir nach dem "Username"-Feld suchen + try: + username_input_selector = 'input[name="username"]' + logging.info(f"Suche nach Username-Feld mit Selektor: {username_input_selector}") + await page.waitForSelector(username_input_selector, {'timeout': 5000}) # 5 Sekunden warten + + logging.info("Login-Formular erkannt. Fülle Anmeldedaten aus...") + await page.type(username_input_selector, HA_USERNAME) + await page.type('input[name="password"]', HA_PASSWORD) + + logging.info("Klicke auf 'LOG IN'-Button...") + await page.click('button[type="submit"]') + + logging.info("Warte nach Login auf Navigation/Neuladen...") + # Wir warten, bis ein bekanntes Element des Dashboards erscheint. + # Ein guter Kandidat ist der "overview"-Tab oder ein spezifisches Element Ihrer Solar-Ansicht. + # Wir verwenden einen allgemeinen, der wahrscheinlich da ist: + await page.waitForSelector('ha-tab[aria-label="Übersicht"]', {'timeout': 20000}) + logging.info("Login erfolgreich, Dashboard-Element gefunden.") + await asyncio.sleep(5) # Extra Wartezeit für das Rendern des Dashboards + + except TimeoutError: + logging.info("Login-Formular nicht gefunden. Gehe davon aus, dass wir bereits eingeloggt sind.") - logging.info("Seite geladen. Warte 10 Sekunden auf das finale Rendering...") - await asyncio.sleep(10) - - logging.info("Erstelle Screenshot...") + # Erneuter Navigationsversuch zur finalen URL, falls die Weiterleitung nicht geklappt hat + if "solar" not in page.url: + logging.info(f"Navigiere erneut zur finalen URL: {HA_URL}") + await page.goto(HA_URL, {'waitUntil': 'networkidle0', 'timeout': 60000}) + await asyncio.sleep(10) + + logging.info("Erstelle finalen Screenshot...") await page.screenshot({'path': OUTPUT_FILE}) logging.info(f"Screenshot erfolgreich unter {OUTPUT_FILE} gespeichert.") - + except Exception as e: logging.error(f"Ein Fehler ist aufgetreten: {e}", exc_info=True) - logging.info("Speichere trotzdem einen Screenshot des Fehler-Zustands...") + logging.info("Speichere Screenshot des Fehler-Zustands...") await page.screenshot({'path': '/screenshots/debug_error_final.png'}) finally: @@ -58,7 +81,6 @@ async def main(): await browser.close() if __name__ == '__main__': - # Stellt sicher, dass das Skript auch bei Fehlern nicht sofort abbricht try: asyncio.run(main()) except Exception as e: