Files
ha_explore/backend/app/services/scanner.py
2026-02-21 16:55:10 +01:00

54 lines
1.7 KiB
Python

import json
from datetime import datetime
from sqlmodel import Session, select
from app.database import get_engine
from app.ha_client import ha_client, normalize_entity
from app.models import EntityCache
from app.scan_state import scan_state
async def run_scan():
scan_state.start()
try:
states = await ha_client.fetch_all_states()
scan_state.total = len(states)
# Tenter de récupérer le registry (peut échouer si WS non dispo)
registry_map: dict[str, dict] = {}
try:
registry = await ha_client.fetch_entity_registry()
registry_map = {e["entity_id"]: e for e in registry}
except Exception:
pass # On continue sans registry
with Session(get_engine()) as session:
for i, state in enumerate(states):
entity_id = state.get("entity_id", "")
reg_entry = registry_map.get(entity_id)
normalized = normalize_entity(state, reg_entry)
existing = session.get(EntityCache, entity_id)
if existing:
for key, value in normalized.items():
if key != "entity_id":
setattr(existing, key, value)
existing.fetched_at = datetime.utcnow()
else:
entity = EntityCache(
**normalized,
fetched_at=datetime.utcnow(),
)
session.add(entity)
scan_state.progress = i + 1
session.commit()
scan_state.finish(len(states))
except Exception as e:
scan_state.fail(str(e))
raise