Improve error handling for Home Assistant API requests

Add _safe_request method with proper error handling for:
- Invalid/expired tokens (401)
- Permission denied (403)
- Connection timeouts
- Invalid JSON responses
- Network errors

This provides clearer error messages to users instead of cryptic JSON parse errors.
This commit is contained in:
Claude 2025-12-13 14:21:05 +00:00
parent eb77fdd17d
commit 2ec4bc93d5
No known key found for this signature in database

View file

@ -38,31 +38,44 @@ class HomeAssistantOverview:
print(f"✗ Verbindungsfehler: {e}")
return False
def _safe_request(self, endpoint):
"""Sichere API-Anfrage mit Error-Handling"""
try:
response = requests.get(f"{self.url}{endpoint}", headers=self.headers, timeout=30)
if response.status_code == 401:
raise Exception("Token ungültig oder abgelaufen")
if response.status_code == 403:
raise Exception("Zugriff verweigert - Token hat keine Berechtigung")
if response.status_code != 200:
raise Exception(f"API-Fehler: HTTP {response.status_code}")
return response.json()
except requests.exceptions.JSONDecodeError as e:
raise Exception(f"Ungültige API-Antwort (kein JSON): {str(e)[:100]}")
except requests.exceptions.Timeout:
raise Exception("Zeitüberschreitung - Home Assistant antwortet nicht")
except requests.exceptions.ConnectionError:
raise Exception("Verbindungsfehler - Home Assistant nicht erreichbar")
def get_config(self):
"""Hole die Konfiguration"""
response = requests.get(f"{self.url}/api/config", headers=self.headers)
return response.json()
return self._safe_request("/api/config")
def get_components(self):
"""Hole alle installierten Komponenten/Integrationen"""
response = requests.get(f"{self.url}/api/config/core", headers=self.headers)
data = response.json()
data = self._safe_request("/api/config/core")
return data.get('components', [])
def get_states(self):
"""Hole alle Entitäten mit ihren Zuständen"""
response = requests.get(f"{self.url}/api/states", headers=self.headers)
return response.json()
return self._safe_request("/api/states")
def get_services(self):
"""Hole alle verfügbaren Services"""
response = requests.get(f"{self.url}/api/services", headers=self.headers)
return response.json()
return self._safe_request("/api/services")
def get_events(self):
"""Hole alle verfügbaren Events"""
response = requests.get(f"{self.url}/api/events", headers=self.headers)
return response.json()
return self._safe_request("/api/events")
def analyze_entities(self, states):
"""Analysiere Entitäten nach Domains"""