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') # --- Konfiguration --- HA_URL = "http://192.168.178.131:8123/lovelace/solar?kiosk" OUTPUT_FILE = "/screenshots/debug_screenshot_final.png" # 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_USERNAME or not HA_PASSWORD: logging.error("Fehler: HA_USERNAME oder HA_PASSWORD Umgebungsvariable nicht gefunden!") return logging.info("Starte Puppeteer-Browser...") browser = await launch( executablePath='/usr/bin/chromium', headless=True, ignoreHTTPSErrors=True, args=['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage'] ) page = await browser.newPage() await page.setViewport({'width': 1280, 'height': 1024}) try: logging.info(f"Navigiere zur initialen URL: {HA_URL}") await page.goto(HA_URL, {'waitUntil': 'networkidle0', 'timeout': 60000}) await asyncio.sleep(3) # Warten, bis das Login-Formular bereit ist username_input_selector = 'input[name="username"]' await page.waitForSelector(username_input_selector, {'timeout': 10000}) 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) # --- FINALE, ROBUSTE KLICK-METHODE VIA JAVASCRIPT --- # Dieses Skript dringt in den Shadow DOM ein, um den Button zu finden und zu klicken. logging.info("Klicke auf 'LOG IN'-Button via JavaScript (für Shadow DOM)...") await page.evaluate('''() => { document.querySelector('ha-auth-flow').shadowRoot.querySelector('ha-form > mwc-button').click(); }''') logging.info("Warte nach Login auf Navigation/Neuladen...") # Wir warten darauf, dass die Login-Maske verschwindet. # Ein guter Indikator ist, wenn das 'ha-auth-flow'-Element nicht mehr da ist. await page.waitForSelector('ha-auth-flow', {'hidden': True, 'timeout': 20000}) logging.info("Login erfolgreich, Seite wird neu geladen. Warte auf finale Ansicht...") await asyncio.sleep(10) # Finale Wartezeit für das Dashboard-Rendering 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 Screenshot des Fehler-Zustands...") await page.screenshot({'path': '/screenshots/debug_error_final.png'}) finally: logging.info("Schließe Browser.") await browser.close()