WIP: Dockerfile update + Grafana dashboard JSON + InfluxDB population script
This commit is contained in:
76
populate_influx.py
Normal file
76
populate_influx.py
Normal file
@@ -0,0 +1,76 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Populate InfluxDB with Smart City sensor data for Martinique."""
|
||||
import os
|
||||
import time
|
||||
import random
|
||||
from datetime import datetime, timezone
|
||||
|
||||
try:
|
||||
import influxdb_client
|
||||
from influxdb_client.client.write_api import SYNCHRONOUS
|
||||
except ImportError:
|
||||
print("❌ influxdb-client not installed. Run: pip install influxdb-client")
|
||||
exit(1)
|
||||
|
||||
# Config
|
||||
INFLUX_URL = os.environ.get("INFLUX_URL", "http://localhost:8086")
|
||||
INFLUX_ORG = os.environ.get("INFLUX_ORG", "digitribe")
|
||||
INFLUX_BUCKET = os.environ.get("INFLUX_BUCKET", "iot_data")
|
||||
INFLUX_TOKEN = os.environ.get("INFLUX_TOKEN",
|
||||
"yA8zFZYsPOLDdDxlviIfHw_5gELH8k439TANamk2JiJIyAbhyNCHDzUeYJkjL-hAy99fs_96j_59WprZy98A==")
|
||||
|
||||
# Martinique coordinates (Fort-de-France area)
|
||||
BASE_LAT = 14.6091
|
||||
BASE_LON = -61.2155
|
||||
|
||||
# Sensor types and their fields
|
||||
SENSOR_TYPES = {
|
||||
"traffic": {
|
||||
"fields": {"vehicle_count": (10, 150), "average_speed_kmh": (10, 80), "congestion_level": (0, 5)},
|
||||
"locations": ["Carrefour Central", "Avenue des Caraïbes", "Boulevard Pasteur", "Rue des Flamboyants", "Place de la République"]
|
||||
},
|
||||
"airquality": {
|
||||
"fields": {"pm25_ugm3": (5, 80), "pm10_ugm3": (10, 150), "no2_ugm3": (5, 60), "o3_ugm3": (20, 120)},
|
||||
"locations": ["Quartier Bonde", "Port de Fort-de-France", "Château Denis", "Lamentin Aéroport"]
|
||||
},
|
||||
"parking": {
|
||||
"fields": {"total_spots": (50, 500), "available_spots": (0, 500), "occupancy_percent": (0, 100)},
|
||||
"locations": ["Parking Rivière-Salée", "Parking Cluny", "Parking Médoc", "Parking Grand-Camp"]
|
||||
},
|
||||
}
|
||||
|
||||
def main():
|
||||
print("📈 Connecting to InfluxDB...")
|
||||
client = influxdb_client.InfluxDBClient(url=INFLUX_URL, token=INFLUX_TOKEN, org=INFLUX_ORG)
|
||||
write_api = client.write_api(write_options=SYNCHRONOUS)
|
||||
|
||||
points = []
|
||||
now = datetime.now(timezone.utc)
|
||||
|
||||
print("📊 Generating sensor data for Martinique...")
|
||||
|
||||
for stype, config in SENSOR_TYPES.items():
|
||||
for i, location in enumerate(config["locations"]):
|
||||
sid = f"{stype}_{i:03d}"
|
||||
lat = BASE_LAT + random.uniform(-0.05, 0.05)
|
||||
lon = BASE_LON + random.uniform(-0.05, 0.05)
|
||||
|
||||
for field, (lo, hi) in config["fields"].items():
|
||||
value = round(random.uniform(lo, hi), 1)
|
||||
p = influxdb_client.Point(stype)\
|
||||
.tag("sensor_id", sid)\
|
||||
.tag("location", location)\
|
||||
.field(field, float(value))\
|
||||
.field("lat", lat)\
|
||||
.field("lon", lon)\
|
||||
.time(now)
|
||||
points.append(p)
|
||||
|
||||
print(f"📤 Writing {len(points)} points to bucket '{INFLUX_BUCKET}'...")
|
||||
write_api.write(bucket=INFLUX_BUCKET, record=points)
|
||||
print(f"✅ Done! {len(points)} points written.")
|
||||
|
||||
client.close()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user