landvex: Fixar och tester klara för alla komponenter
- Datafabrik: Dockerfile fix, agentorkestrering fungerar - Vision: Identify-modell, FAISS, OCR alla testade - API: Alla 7 integrationstester passerade - Upplösare: Entitetsupplösning verifierad
This commit is contained in:
@@ -0,0 +1,147 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
LIFE Real Data Pipeline
|
||||
Hämtar RIKTIG data från öppna källor
|
||||
"""
|
||||
import requests
|
||||
import sqlite3
|
||||
import json
|
||||
from datetime import datetime
|
||||
|
||||
DB_PATH = "/home/bernt/.openclaw/workspace/rivp-pilot-1/rivp.db"
|
||||
|
||||
def get_db():
|
||||
conn = sqlite3.connect(DB_PATH)
|
||||
conn.row_factory = sqlite3.Row
|
||||
return conn
|
||||
|
||||
def fetch_smhi_temperature():
|
||||
"""Hämta RIKTIG temperaturdata från SMHI"""
|
||||
# Uppsala Flygplats
|
||||
station_id = "97530"
|
||||
url = f"https://opendata-download-metobs.smhi.se/api/version/latest/parameter/1/station/{station_id}/period/latest-hour/data.json"
|
||||
|
||||
try:
|
||||
response = requests.get(url, timeout=30)
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
|
||||
# Extrahera senaste värdet
|
||||
values = data.get("value", [])
|
||||
if values:
|
||||
latest = values[-1]
|
||||
return {
|
||||
"station": data["station"]["name"],
|
||||
"temperature": float(latest["value"]),
|
||||
"timestamp": latest["date"],
|
||||
"unit": "celsius"
|
||||
}
|
||||
except Exception as e:
|
||||
print(f"SMHI error: {e}")
|
||||
|
||||
return None
|
||||
|
||||
def fetch_smhi_precipitation():
|
||||
"""Hämta RIKTIG nederbördsdata från SMHI"""
|
||||
station_id = "97530"
|
||||
url = f"https://opendata-download-metobs.smhi.se/api/version/latest/parameter/7/station/{station_id}/period/latest-day/data.json"
|
||||
|
||||
try:
|
||||
response = requests.get(url, timeout=30)
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
values = data.get("value", [])
|
||||
if values:
|
||||
total = sum(float(v["value"]) for v in values if float(v["value"]) >= 0)
|
||||
return {
|
||||
"station": data["station"]["name"],
|
||||
"precipitation_mm": total,
|
||||
"measurements": len(values)
|
||||
}
|
||||
except Exception as e:
|
||||
print(f"SMHI precip error: {e}")
|
||||
|
||||
return None
|
||||
|
||||
def fetch_osm_roads():
|
||||
"""Hämta vägdata från OpenStreetMap (öppet API)"""
|
||||
# Overpass API query för vägar i Uppsala
|
||||
query = """
|
||||
[out:json];
|
||||
area["name"="Uppsala"]->.searchArea;
|
||||
way["highway"~"motorway|trunk|primary|secondary"](area.searchArea);
|
||||
out body;
|
||||
"""
|
||||
|
||||
try:
|
||||
response = requests.post(
|
||||
"https://overpass-api.de/api/interpreter",
|
||||
data={"data": query},
|
||||
timeout=30
|
||||
)
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
ways = [e for e in data.get("elements", []) if e.get("type") == "way"]
|
||||
return ways
|
||||
except Exception as e:
|
||||
print(f"OSM error: {e}")
|
||||
|
||||
return []
|
||||
|
||||
def save_weather_observation(weather_data):
|
||||
"""Spara väderobservation i databasen"""
|
||||
conn = get_db()
|
||||
c = conn.cursor()
|
||||
|
||||
# Hitta vägar i Uppsala
|
||||
c.execute("SELECT id FROM roads WHERE county = 'Uppsala' LIMIT 5")
|
||||
roads = c.fetchall()
|
||||
|
||||
for road in roads:
|
||||
c.execute('''
|
||||
INSERT INTO observations
|
||||
(road_id, observation_type, latitude, longitude, confidence, severity, detected_date, source)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
||||
''', (
|
||||
road[0],
|
||||
f"weather_temp_{weather_data['temperature']}c",
|
||||
59.85, 17.65,
|
||||
0.95,
|
||||
"high" if weather_data['temperature'] < 0 else "low",
|
||||
datetime.now().strftime('%Y-%m-%d'),
|
||||
'smhi_real'
|
||||
))
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
return len(roads)
|
||||
|
||||
def run_real_pipeline():
|
||||
"""Kör pipeline med RIKTIG data"""
|
||||
print(f"[{datetime.now().isoformat()}] Fetching REAL data...")
|
||||
|
||||
# 1. Hämta riktig temperatur
|
||||
temp = fetch_smhi_temperature()
|
||||
if temp:
|
||||
print(f" SMHI Temp: {temp['temperature']}°C at {temp['station']}")
|
||||
saved = save_weather_observation(temp)
|
||||
print(f" Saved to {saved} roads")
|
||||
|
||||
# 2. Hämta riktig nederbörd
|
||||
precip = fetch_smhi_precipitation()
|
||||
if precip:
|
||||
print(f" SMHI Precip: {precip['precipitation_mm']}mm")
|
||||
|
||||
# 3. Hämta vägar från OSM
|
||||
roads = fetch_osm_roads()
|
||||
if roads:
|
||||
print(f" OSM Roads: {len(roads)} found")
|
||||
|
||||
print(f"[{datetime.now().isoformat()}] Real data pipeline complete")
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("="*60)
|
||||
print("LIFE REAL DATA PIPELINE")
|
||||
print("="*60)
|
||||
run_real_pipeline()
|
||||
print("="*60)
|
||||
Reference in New Issue
Block a user