- docker-compose.influxdb.yml: InfluxDB v2 on smartcity-shared + traefik-public - docker-compose.grafana.yml: Grafana 10.2 on smartcity-shared + traefik-public - grafana/provisioning/: dashboards + datasources updated for smart-city - pulsar/docker-compose.yml: added smartcity-shared network for simulator access Services migrated (preserving existing volumes): - digital-twin-influxdb → smart-city-influxdb - digital-twin-grafana → smart-city-grafana Traefik routes updated: - influxdb.digitribe.fr → smart-city-influxdb:8086 - grafana.digitribe.fr → smart-city-grafana:3000
348 lines
7.6 KiB
JSON
348 lines
7.6 KiB
JSON
{
|
|
"timezone": "Americas/Martinique",
|
|
"timepicker": {
|
|
"time_options": [
|
|
"5m",
|
|
"15m",
|
|
"1h",
|
|
"6h",
|
|
"12h",
|
|
"24h",
|
|
"2d"
|
|
],
|
|
"nowDelay": "5s"
|
|
},
|
|
"title": "Smart City Digital Twin - Overview",
|
|
"tags": [
|
|
"smart-city",
|
|
"digital-twin",
|
|
"overview"
|
|
],
|
|
"schemaVersion": 16,
|
|
"version": 1,
|
|
"refresh": "5s",
|
|
"panels": [
|
|
{
|
|
"id": 1,
|
|
"title": "Total Vehicles",
|
|
"type": "stat",
|
|
"gridPos": {
|
|
"x": 0,
|
|
"y": 0,
|
|
"w": 4,
|
|
"h": 4
|
|
},
|
|
"targets": [
|
|
{
|
|
"query": "from(bucket: \"iot_data\") |> range(start: -24h) |> filter(fn: (r) => r[\"_measurement\"] == \"traffic\") |> group(columns: [\"sensor_id\"]) |> sum()"
|
|
}
|
|
],
|
|
"options": {
|
|
"colorMode": "background",
|
|
"graphMode": "none",
|
|
"justifyMode": "center",
|
|
"orientation": "auto"
|
|
},
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"unit": "short",
|
|
"color": {
|
|
"mode": "thresholds"
|
|
},
|
|
"thresholds": {
|
|
"mode": "absolute",
|
|
"steps": [
|
|
{
|
|
"color": "green",
|
|
"value": null
|
|
},
|
|
{
|
|
"color": "yellow",
|
|
"value": 150
|
|
},
|
|
{
|
|
"color": "red",
|
|
"value": 300
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": 2,
|
|
"title": "Average Air Quality Index",
|
|
"type": "gauge",
|
|
"gridPos": {
|
|
"x": 4,
|
|
"y": 0,
|
|
"w": 4,
|
|
"h": 4
|
|
},
|
|
"targets": [
|
|
{
|
|
"query": "from(bucket: \"iot_data\") |> range(start: -24h) |> filter(fn: (r) => r[\"_measurement\"] == \"airquality\") |> mean(column: \"air_quality_index\")"
|
|
}
|
|
],
|
|
"options": {
|
|
"showThresholdLabels": false,
|
|
"showThresholdMarkers": true
|
|
},
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"min": 1,
|
|
"max": 5,
|
|
"unit": "short",
|
|
"color": {
|
|
"mode": "thresholds"
|
|
},
|
|
"thresholds": {
|
|
"steps": [
|
|
{
|
|
"color": "green",
|
|
"value": null
|
|
},
|
|
{
|
|
"color": "yellow",
|
|
"value": 2
|
|
},
|
|
{
|
|
"color": "orange",
|
|
"value": 3
|
|
},
|
|
{
|
|
"color": "red",
|
|
"value": 4
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": 3,
|
|
"title": "Available Parking Spots",
|
|
"type": "stat",
|
|
"gridPos": {
|
|
"x": 8,
|
|
"y": 0,
|
|
"w": 4,
|
|
"h": 4
|
|
},
|
|
"targets": [
|
|
{
|
|
"query": "from(bucket: \"iot_data\") |> range(start: -24h) |> filter(fn: (r) => r[\"_measurement\"] == \"parking\") |> sum(column: \"available_spots\")"
|
|
}
|
|
],
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"unit": "short",
|
|
"color": {
|
|
"mode": "thresholds"
|
|
},
|
|
"thresholds": {
|
|
"steps": [
|
|
{
|
|
"color": "red",
|
|
"value": null
|
|
},
|
|
{
|
|
"color": "yellow",
|
|
"value": 50
|
|
},
|
|
{
|
|
"color": "green",
|
|
"value": 100
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": 4,
|
|
"title": "Average Noise Level",
|
|
"type": "gauge",
|
|
"gridPos": {
|
|
"x": 12,
|
|
"y": 0,
|
|
"w": 4,
|
|
"h": 4
|
|
},
|
|
"targets": [
|
|
{
|
|
"query": "from(bucket: \"iot_data\") |> range(start: -24h) |> filter(fn: (r) => r[\"_measurement\"] == \"noise\") |> mean(column: \"noise_level_db\")"
|
|
}
|
|
],
|
|
"options": {
|
|
"showThresholdLabels": false,
|
|
"showThresholdMarkers": true
|
|
},
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"min": 30,
|
|
"max": 100,
|
|
"unit": "dB",
|
|
"color": {
|
|
"mode": "thresholds"
|
|
},
|
|
"thresholds": {
|
|
"steps": [
|
|
{
|
|
"color": "green",
|
|
"value": null
|
|
},
|
|
{
|
|
"color": "yellow",
|
|
"value": 60
|
|
},
|
|
{
|
|
"color": "orange",
|
|
"value": 75
|
|
},
|
|
{
|
|
"color": "red",
|
|
"value": 85
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": 5,
|
|
"title": "Traffic Over Time",
|
|
"type": "timeseries",
|
|
"gridPos": {
|
|
"x": 0,
|
|
"y": 4,
|
|
"w": 12,
|
|
"h": 6
|
|
},
|
|
"targets": [
|
|
{
|
|
"query": "from(bucket: \"iot_data\") |> range(start: -24h) |> filter(fn: (r) => r[\"_measurement\"] == \"traffic\") |> aggregateWindow(every: 1m, fn: mean)"
|
|
}
|
|
],
|
|
"options": {
|
|
"legend": {
|
|
"displayMode": "hidden"
|
|
},
|
|
"tooltip": {
|
|
"mode": "single"
|
|
}
|
|
},
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"unit": "short",
|
|
"color": {
|
|
"mode": "palette-classic"
|
|
},
|
|
"custom": {
|
|
"lineWidth": 2,
|
|
"fillOpacity": 10,
|
|
"gradientMode": "opacity"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": 6,
|
|
"title": "Air Quality - PM2.5",
|
|
"type": "timeseries",
|
|
"gridPos": {
|
|
"x": 12,
|
|
"y": 4,
|
|
"w": 12,
|
|
"h": 6
|
|
},
|
|
"targets": [
|
|
{
|
|
"query": "from(bucket: \"iot_data\") |> range(start: -24h) |> filter(fn: (r) => r[\"_measurement\"] == \"airquality\") |> aggregateWindow(every: 1m, fn: mean)"
|
|
}
|
|
],
|
|
"options": {
|
|
"legend": {
|
|
"displayMode": "hidden"
|
|
},
|
|
"tooltip": {
|
|
"mode": "single"
|
|
}
|
|
},
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"unit": "\u03bcg/m\u00b3",
|
|
"color": {
|
|
"mode": "palette-classic"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": 7,
|
|
"title": "Parking Availability",
|
|
"type": "piechart",
|
|
"gridPos": {
|
|
"x": 0,
|
|
"y": 10,
|
|
"w": 8,
|
|
"h": 6
|
|
},
|
|
"targets": [
|
|
{
|
|
"query": "from(bucket: \"iot_data\") |> range(start: -24h) |> filter(fn: (r) => r[\"_measurement\"] == \"parking\") |> group(columns: [\"sensor_name\"]) |> sum()"
|
|
}
|
|
],
|
|
"options": {
|
|
"pieType": "donut",
|
|
"displayLabels": "name",
|
|
"legend": {
|
|
"displayMode": "table",
|
|
"placement": "right",
|
|
"values": [
|
|
"value"
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": 8,
|
|
"title": "Weather Conditions",
|
|
"type": "timeseries",
|
|
"gridPos": {
|
|
"x": 8,
|
|
"y": 10,
|
|
"w": 16,
|
|
"h": 6
|
|
},
|
|
"targets": [
|
|
{
|
|
"query": "from(bucket: \"iot_data\") |> range(start: -24h) |> filter(fn: (r) => r[\"_measurement\"] == \"weather\") |> aggregateWindow(every: 5m, fn: mean)"
|
|
}
|
|
],
|
|
"options": {
|
|
"legend": {
|
|
"displayMode": "hidden"
|
|
},
|
|
"tooltip": {
|
|
"mode": "single"
|
|
}
|
|
},
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"color": {
|
|
"mode": "palette-classic"
|
|
},
|
|
"custom": {
|
|
"lineWidth": 2,
|
|
"fillOpacity": 5
|
|
}
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"time": {
|
|
"from": "now-24h",
|
|
"to": "now"
|
|
}
|
|
} |