fix: Traefik routing OpenRemote/Ditto + QuantumLeap config (2026-05-08)
This commit is contained in:
177
create_dashboard_fixed.py
Normal file
177
create_dashboard_fixed.py
Normal file
@@ -0,0 +1,177 @@
|
||||
#!/usr/bin/env python3
|
||||
import json
|
||||
|
||||
# UID de la source InfluxDB (à récupérer via l'API Grafana)
|
||||
# On va utiliser l'UID par défaut ou le récupérer
|
||||
import requests
|
||||
import os
|
||||
|
||||
# Récupérer l'UID de la datasource InfluxDB
|
||||
try:
|
||||
resp = requests.get('http://grafana.digitribe.fr/api/datasources', auth=('admin', 'Digitribe972'))
|
||||
ds_uid = None
|
||||
if resp.ok:
|
||||
for ds in resp.json():
|
||||
if 'influx' in ds['type'].lower():
|
||||
ds_uid = ds['uid']
|
||||
print(f"Datasource InfluxDB trouvée: {ds['name']} (UID: {ds_uid})")
|
||||
break
|
||||
except:
|
||||
pass
|
||||
|
||||
if not ds_uid:
|
||||
ds_uid = 'influxdb' # Fallback
|
||||
print(f"Utilisation UID par défaut: {ds_uid}")
|
||||
|
||||
dashboard = {
|
||||
"annotations": {"list": []},
|
||||
"editable": True,
|
||||
"fiscalYearStartMonth": 0,
|
||||
"graphTooltip": 0,
|
||||
"id": None,
|
||||
"links": [],
|
||||
"panels": [
|
||||
# Air Quality Panel
|
||||
{
|
||||
"title": "Air Quality - PM2.5",
|
||||
"type": "timeseries",
|
||||
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 0},
|
||||
"targets": [
|
||||
{
|
||||
"query": 'from(bucket:"smartcity")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r["_measurement"] == "airquality")\n |> filter(fn: (r) => r["_field"] == "pm25_ugm3")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: "mean")',
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"datasource": {"type": "influxdb", "uid": ds_uid},
|
||||
},
|
||||
{
|
||||
"title": "Air Quality - CO",
|
||||
"type": "timeseries",
|
||||
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 0},
|
||||
"targets": [
|
||||
{
|
||||
"query": 'from(bucket:"smartcity")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r["_measurement"] == "airquality")\n |> filter(fn: (r) => r["_field"] == "co_mgm3")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: "mean")',
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"datasource": {"type": "influxdb", "uid": ds_uid},
|
||||
},
|
||||
# Traffic Panel
|
||||
{
|
||||
"title": "Traffic - Average Speed",
|
||||
"type": "timeseries",
|
||||
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 8},
|
||||
"targets": [
|
||||
{
|
||||
"query": 'from(bucket:"smartcity")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r["_measurement"] == "traffic")\n |> filter(fn: (r) => r["_field"] == "average_speed_kmh")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: "mean")',
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"datasource": {"type": "influxdb", "uid": ds_uid},
|
||||
},
|
||||
{
|
||||
"title": "Traffic - Congestion",
|
||||
"type": "timeseries",
|
||||
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 8},
|
||||
"targets": [
|
||||
{
|
||||
"query": 'from(bucket:"smartcity")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r["_measurement"] == "traffic")\n |> filter(fn: (r) => r["_field"] == "congestion_level")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: "mean")',
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"datasource": {"type": "influxdb", "uid": ds_uid},
|
||||
},
|
||||
# Parking Panel
|
||||
{
|
||||
"title": "Parking - Available Spots",
|
||||
"type": "timeseries",
|
||||
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 16},
|
||||
"targets": [
|
||||
{
|
||||
"query": 'from(bucket:"smartcity")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r["_measurement"] == "parking")\n |> filter(fn: (r) => r["_field"] == "available_spots")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: "mean")',
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"datasource": {"type": "influxdb", "uid": ds_uid},
|
||||
},
|
||||
{
|
||||
"title": "Parking - Occupancy %",
|
||||
"type": "timeseries",
|
||||
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 16},
|
||||
"targets": [
|
||||
{
|
||||
"query": 'from(bucket:"smartcity")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r["_measurement"] == "parking")\n |> filter(fn: (r) => r["_field"] == "occupancy_percent")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: "mean")',
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"datasource": {"type": "influxdb", "uid": ds_uid},
|
||||
},
|
||||
# Noise Panel
|
||||
{
|
||||
"title": "Noise Level (dB)",
|
||||
"type": "timeseries",
|
||||
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 24},
|
||||
"targets": [
|
||||
{
|
||||
"query": 'from(bucket:"smartcity")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r["_measurement"] == "noise")\n |> filter(fn: (r) => r["_field"] == "noise_level_db")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: "mean")',
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"datasource": {"type": "influxdb", "uid": ds_uid},
|
||||
},
|
||||
# Weather Panel
|
||||
{
|
||||
"title": "Weather - Temperature",
|
||||
"type": "timeseries",
|
||||
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 24},
|
||||
"targets": [
|
||||
{
|
||||
"query": 'from(bucket:"smartcity")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r["_measurement"] == "weather")\n |> filter(fn: (r) => r["_field"] == "temperature_celsius")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: "mean")',
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"datasource": {"type": "influxdb", "uid": ds_uid},
|
||||
},
|
||||
# Light Panel
|
||||
{
|
||||
"title": "Light - Brightness",
|
||||
"type": "timeseries",
|
||||
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 32},
|
||||
"targets": [
|
||||
{
|
||||
"query": 'from(bucket:"smartcity")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r["_measurement"] == "light")\n |> filter(fn: (r) => r["_field"] == "brightness_lux")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: "mean")',
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"datasource": {"type": "influxdb", "uid": ds_uid},
|
||||
},
|
||||
{
|
||||
"title": "Light - Power Consumption",
|
||||
"type": "timeseries",
|
||||
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 32},
|
||||
"targets": [
|
||||
{
|
||||
"query": 'from(bucket:"smartcity")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r["_measurement"] == "light")\n |> filter(fn: (r) => r["_field"] == "power_consumption_w")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: "mean")',
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"datasource": {"type": "influxdb", "uid": ds_uid},
|
||||
}
|
||||
],
|
||||
"schemaVersion": 38,
|
||||
"style": "dark",
|
||||
"tags": ["smart-city", "martinique", "iot"],
|
||||
"templating": {"list": []},
|
||||
"time": {"from": "now-1h", "to": "now"},
|
||||
"title": "Smart City Digital Twin - Martinique (Fixed)",
|
||||
"uid": "smartcity-martinique-2026-v2",
|
||||
"version": 2
|
||||
}
|
||||
|
||||
# Sauvegarder
|
||||
with open('/home/eric/smart-city-digital-twin-martinique/grafana-dashboard-fixed.json', 'w') as f:
|
||||
json.dump(dashboard, f, indent=2)
|
||||
|
||||
print("✅ Dashboard avec bonnes requêtes Flux créé")
|
||||
print(f" Fichier: grafana-dashboard-fixed.json")
|
||||
print(f" Datasource UID: {ds_uid}")
|
||||
Reference in New Issue
Block a user