import html from datetime import datetime import httpx QUERY = """ query GetAllSensors { sensors { id name nameExtern description measureConcept { id name description } } } """.strip() def escape_text(value, default=""): text = default if value is None else str(value) return html.escape(text, quote=True) def build_error(message): return ( "
" f"{escape_text(message)}" "
" ) def build_report(): with httpx.Client() as client: response = client.post( f"{EXTERNAL_BASE_URL}/graphql", json={"query": QUERY}, headers=AUTH_HEADERS, timeout=30.0, ) if response.status_code != 200: return build_error(f"Fehler beim Abrufen der Sensoren: {response.status_code}") data = response.json() sensors = data.get("data", {}).get("sensors", []) sensors.sort( key=lambda s: ( (s.get("measureConcept") or {}).get("name", "").strip(), (s.get("name") or "").strip(), ) ) measure_concepts = {} for sensor in sensors: measure_concept = sensor.get("measureConcept") or {} mc_id = str(measure_concept.get("id") or "unknown") mc_name = (measure_concept.get("name") or "Unbekannt").strip() mc_desc = measure_concept.get("description") or "" if mc_id not in measure_concepts: measure_concepts[mc_id] = { "name": mc_name, "description": mc_desc, "sensors": [], } measure_concepts[mc_id]["sensors"].append(sensor) total_sensors = len(sensors) total_concepts = len(measure_concepts) html_output = f""" Sensor Liste

Sensor Uebersicht

{total_sensors}
Sensoren gesamt
{total_concepts}
MeasureConcepts
""" for mc_id, mc_data in sorted(measure_concepts.items(), key=lambda item: item[1]["name"]): safe_mc_id = escape_text(mc_id) mc_name = escape_text(mc_data["name"], "Unbekannt") mc_desc = escape_text(mc_data["description"]) sensors_in_concept = mc_data["sensors"] html_output += f"""

{mc_name} {len(sensors_in_concept)} Sensoren

""" if mc_desc: html_output += f'
{mc_desc}
\n' html_output += f"""
""" for sensor in sensors_in_concept: sensor_id = escape_text(sensor.get("id"), "Unbekannt") sensor_name = escape_text((sensor.get("name") or "").strip(), "Unbekannter Name") sensor_extern = escape_text(sensor.get("nameExtern") or "") sensor_desc = escape_text(sensor.get("description") or "") html_output += f"""
ID: {sensor_id}
{sensor_name}
""" if sensor_extern and sensor_extern != "-": html_output += f'
Extern: {sensor_extern}
\n' if sensor_desc: html_output += f'
{sensor_desc}
\n' else: html_output += '
Keine Beschreibung verfuegbar
\n' html_output += "
\n" html_output += """
""" current_time = datetime.now().strftime("%d.%m.%Y um %H:%M:%S") html_output += f"""
Erstellt am {current_time}
""" return html_output result = build_report() print(result)