Optimize dashboard categories and context loading
Some checks failed
quality / test (3.11) (push) Has been cancelled
quality / test (3.13) (push) Has been cancelled

This commit is contained in:
2026-06-17 00:02:19 +02:00
parent 9ddb065f62
commit f8bee92e64
9 changed files with 203 additions and 27 deletions

View File

@@ -72,29 +72,42 @@ _MANUAL_CONTEXT_DOMAINS = frozenset({
"device_tracker",
"fan",
"humidifier",
"input_boolean",
"input_number",
"input_select",
"light",
"media_player",
"person",
"remote",
"scene",
"sensor",
"sun",
"switch",
"weather",
})
_CONTEXT_SUGGESTION_LIMIT = 120
_CONTEXT_SUGGESTION_LIMIT = 500
_OUTDOOR_TOKENS = frozenset({"aussen", "außen", "outdoor", "garten", "terrasse", "balkon"})
_DIAGNOSTIC_TOKENS = frozenset({
"basic",
"battery",
"bytes",
"connect",
"count",
"data",
"diagnostic",
"firmware",
"gesehen",
"heat",
"inbytes",
"interface",
"last",
"linkquality",
"knoten",
"knotens",
"mqtt",
"node",
"outbytes",
"pfsense",
"reason",
"restart",
"rssi",
@@ -105,6 +118,7 @@ _DIAGNOSTIC_TOKENS = frozenset({
"overheating",
"overload",
"uptime",
"vpn",
"uberhitzung",
"ueberhitzung",
"ueberlast",
@@ -175,13 +189,10 @@ class ActuatorReconciliationService:
selected = entity.entity_id in selected_ids
if selected:
score = max(score, 1.0)
if not selected and (
_is_diagnostic_context(entity)
or not _has_context_relationship(actuator, entity)
):
continue
if not selected and score < 0.1:
if not selected and _is_diagnostic_context(entity):
continue
if not selected and not _has_context_relationship(actuator, entity):
score = max(score, 0.01)
ranked.append((score, _context_sort_group(entity), entity))
ranked.sort(
key=lambda item: (
@@ -849,12 +860,17 @@ def _merge_manual_candidates(
for entity_id in selected_entity_ids:
existing = by_id.get(entity_id)
if existing is not None:
evidence = [
item
for item in existing.evidence
if item != "Manuell vom Nutzer als relevant festgelegt."
]
by_id[entity_id] = existing.model_copy(
update={
"auto_accepted": True,
"confidence": 1.0,
"evidence": [
*existing.evidence,
*evidence,
"Manuell vom Nutzer als relevant festgelegt.",
],
}
@@ -883,13 +899,28 @@ def _merge_manual_candidates(
def _preferred_device_classes(domain: str, *, context: bool) -> frozenset[str]:
if context:
return frozenset({"door", "garage_door", "motion", "occupancy", "opening", "presence"})
mapping = {
"climate": {"occupancy", "presence", "window"},
"cover": {"illuminance", "wind_speed"},
"fan": {"humidity", "moisture", "occupancy", "presence", "temperature"},
"humidifier": {"humidity", "moisture", "temperature"},
"light": {"door", "garage_door", "motion", "occupancy", "opening", "presence", "window"},
"switch": {"door", "garage_door", "motion", "occupancy", "opening", "presence", "window"},
}
return frozenset(
mapping.get(
domain,
{"door", "garage_door", "motion", "occupancy", "opening", "presence"},
)
)
mapping = {
"climate": {"temperature", "humidity", "power"},
"climate": {"temperature", "humidity"},
"cover": {"illuminance", "temperature", "wind_speed"},
"fan": {"temperature", "humidity", "power"},
"humidifier": {"humidity", "temperature", "power"},
"light": {"illuminance", "power", "energy"},
"fan": {"temperature", "humidity", "moisture"},
"humidifier": {"humidity", "moisture", "temperature"},
"light": {"illuminance"},
"media_player": {"power", "energy"},
"remote": {"battery"},
"switch": {"power", "energy", "current"},
"valve": {"temperature", "pressure", "humidity"},
}