import requests import mysql.connector from datetime import datetime, timezone from dotenv import load_dotenv import os # Laad .env bestand load_dotenv() # Configuratie GOOGLE_MAPS_API_KEY = os.getenv("GOOGLE_MAPS_API_KEY") WEATHER_API_KEY = os.getenv("WEATHER_API_KEY") HOME_ADDRESS = os.getenv("HOME_ADDRESS") WORK_ADDRESS = os.getenv("WORK_ADDRESS") LOG_FILE = "log.txt" SCRIPT_NAME = "LogTravelTime.py" db_config = { "host": os.getenv("DB_HOST"), "user": os.getenv("DB_USER"), "password": os.getenv("DB_PASSWORD"), "database": os.getenv("DB_NAME") } def log_message(message): with open(LOG_FILE, "a") as log_file: timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S") log_file.write(f"[{timestamp}] {SCRIPT_NAME}: {message}\n") def create_table(): connection = mysql.connector.connect(**db_config) cursor = connection.cursor() query = """ CREATE TABLE IF NOT EXISTS travel_times ( utc_datetime CHAR(16), origin VARCHAR(255), destination VARCHAR(255), travel_time INT, direction ENUM('heen', 'terug'), mode ENUM('driving', 'bicycling', 'transit'), temperature FLOAT, weather VARCHAR(255), PRIMARY KEY (utc_datetime, mode, direction) ) """ cursor.execute(query) connection.commit() cursor.close() connection.close() def get_weather(): url = f"https://api.openweathermap.org/data/2.5/weather?q=Amsterdam&appid={WEATHER_API_KEY}&units=metric" response = requests.get(url) data = response.json() if data["cod"] == 200: temperature = data["main"]["temp"] weather = data["weather"][0]["description"] return temperature, weather else: log_message("Error fetching weather data") return None, None def get_travel_time(origin, destination, mode): url = "https://maps.googleapis.com/maps/api/distancematrix/json" params = { "origins": origin, "destinations": destination, "mode": mode, "departure_time": "now", "traffic_model": "best_guess", "key": GOOGLE_MAPS_API_KEY } response = requests.get(url, params=params) data = response.json() if data["status"] == "OK": if mode == "driving": duration = data["rows"][0]["elements"][0]["duration_in_traffic"]["value"] else: duration = data["rows"][0]["elements"][0]["duration"]["value"] return duration // 60 # Minuten else: log_message(f"Error fetching travel time for {mode}") return None def save_travel_time(origin, destination, travel_time, direction, mode, temperature, weather): connection = mysql.connector.connect(**db_config) cursor = connection.cursor() query = """ INSERT INTO travel_times (utc_datetime, origin, destination, travel_time, direction, mode, temperature, weather) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE travel_time = VALUES(travel_time), direction = VALUES(direction), temperature = VALUES(temperature), weather = VALUES(weather) """ utc_now = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M") cursor.execute(query, (utc_now, origin, destination, travel_time, direction, mode, temperature, weather)) connection.commit() cursor.close() connection.close() log_message( f"Saved travel time for {mode} {direction}: {travel_time} minutes, weather: {weather}, temp: {temperature}°C") def main(): create_table() temperature, weather = get_weather() if temperature is None or weather is None: log_message("Skipping travel time logging due to missing weather data") return for mode in ["driving", "bicycling", "transit"]: travel_time_morning = get_travel_time(HOME_ADDRESS, WORK_ADDRESS, mode) if travel_time_morning: save_travel_time(HOME_ADDRESS, WORK_ADDRESS, travel_time_morning, "heen", mode, temperature, weather) travel_time_evening = get_travel_time(WORK_ADDRESS, HOME_ADDRESS, mode) if travel_time_evening: save_travel_time(WORK_ADDRESS, HOME_ADDRESS, travel_time_evening, "terug", mode, temperature, weather) if __name__ == "__main__": main()