debug_screenshot.py aktualisiert

This commit is contained in:
2025-07-05 20:24:53 +00:00
parent a716d5ade1
commit 7c0b1983f3

View File

@@ -1,23 +1,20 @@
import asyncio
import os
import json
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")
OUTPUT_FILE = "/screenshots/hass_screenshot.png"
HA_TOKEN = os.environ.get("HA_ACCESS_TOKEN")
async def main():
if not HA_USERNAME or not HA_PASSWORD:
logging.error("Fehler: HA_USERNAME oder HA_PASSWORD Umgebungsvariable nicht gefunden!")
if not HA_TOKEN:
logging.error("Fehler: Umgebungsvariable HA_ACCESS_TOKEN nicht gefunden!")
return
logging.info("Starte Puppeteer-Browser...")
@@ -32,33 +29,29 @@ async def main():
await page.setViewport({'width': 1280, 'height': 1024})
try:
logging.info(f"Navigiere zur initialen URL: {HA_URL}")
# === NEU: TOKEN-INJEKTION IN DEN LOCAL STORAGE ===
# Dieses JavaScript wird ausgeführt, bevor die Ziel-URL geladen wird.
# Es erstellt den Authentifizierungs-Eintrag, den Home Assistant erwartet.
logging.info("Injiziere Authentifizierungs-Token in den Local Storage des Browsers...")
await page.evaluateOnNewDocument(f'''
localStorage.setItem(
'hassio-token',
JSON.stringify({{
'access_token': '{HA_TOKEN}',
'token_type': 'Bearer',
'expires_in': 86400, // Gültigkeit auf 24h setzen
'expires': new Date().getTime() + 86400 * 1000,
'hassUrl': 'http://192.168.178.131:8123'
}})
);
''')
logging.info(f"Navigiere zur finalen 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)
logging.info("Seite geladen. Warte 15 Sekunden auf das finale Rendering aller Elemente...")
await asyncio.sleep(15) # Großzügige Wartezeit für komplexe Dashboards
# --- 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.")
@@ -70,4 +63,10 @@ async def main():
finally:
logging.info("Schließe Browser.")
await browser.close()
await browser.close()
if __name__ == '__main__':
try:
asyncio.run(main())
except Exception as e:
logging.critical(f"Kritischer Fehler im Hauptprozess: {e}", exc_info=True)