diff --git a/scripts/sensor_list_report.py b/scripts/sensor_list_report.py new file mode 100644 index 0000000..2febd2c --- /dev/null +++ b/scripts/sensor_list_report.py @@ -0,0 +1,414 @@ +import httpx +import json +from datetime import datetime + +# GraphQL Query für alle Sensoren +query = ''' +query GetAllSensors { + sensors { + id + name + nameExtern + description + measureConcept { + id + name + description + } + } +} +''' + +# API Aufruf +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: + result = f"
Fehler beim Abrufen der Sensoren: {response.status_code}
" + else: + data = response.json() + sensors = data.get('data', {}).get('sensors', []) + + # Sortiere Sensoren nach MeasureConcept Name + sensors.sort(key=lambda s: (s['measureConcept']['name'].strip() if s['measureConcept']['name'] else '', s['name'].strip())) + + # Gruppiere nach MeasureConcept + measure_concepts = {} + for sensor in sensors: + mc_id = sensor['measureConcept']['id'] + mc_name = sensor['measureConcept']['name'].strip() if sensor['measureConcept']['name'] else 'Unbekannt' + mc_desc = sensor['measureConcept']['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) + + # Statistiken + total_sensors = len(sensors) + total_concepts = len(measure_concepts) + + # HTML generieren + html = f''' + + + + + Sensor Liste + + + +
+
+

🔧 Sensor Übersicht

+
+
+
{total_sensors}
+
Sensoren gesamt
+
+
+
{total_concepts}
+
MeasureConcepts
+
+
+
+ +
+
+ + +
+
+ + +
+
+ +
+''' + + # MeasureConcepts und Sensoren ausgeben + for mc_id, mc_data in sorted(measure_concepts.items(), key=lambda x: x[1]['name']): + mc_name = mc_data['name'] + mc_desc = mc_data['description'] + sensors_in_concept = mc_data['sensors'] + + html += f''' +
+
+
+

+ 📊 {mc_name} + {len(sensors_in_concept)} Sensoren +

+''' + if mc_desc: + html += f'
{mc_desc}
\n' + + html += ''' +
+
+
+
+''' + + for sensor in sensors_in_concept: + sensor_id = sensor['id'] + sensor_name = sensor['name'].strip() if sensor['name'] else 'Unbekannter Name' + sensor_extern = sensor.get('nameExtern', '') or '' + sensor_desc = sensor.get('description', '') or '' + + html += f''' +
+
ID: {sensor_id}
+
{sensor_name}
+''' + + if sensor_extern and sensor_extern.strip() != '-': + html += f'
Extern: {sensor_extern}
\n' + + if sensor_desc: + html += f'
{sensor_desc}
\n' + else: + html += '
Keine Beschreibung verfügbar
\n' + + html += '
\n' + + html += ''' +
+
+
+''' + + # Timestamp und JavaScript + current_time = datetime.now().strftime('%d.%m.%Y um %H:%M:%S') + html += f''' +
+ +
+ 📅 Erstellt am {current_time} +
+
+ + + + +''' + + result = html