Files
wetterstation/generate-static.py
rxf 4b0ac3a652 Grafik 2 spaltig auch bein iFrame
Übertragen nach sternwarte funktioniert
2026-02-08 15:37:44 +01:00

113 lines
3.2 KiB
Python
Executable File

#!/Users/rxf/Projekte/wetterstation/.venv/bin/python
"""
Generiert statische HTML-Dateien mit aktuellen Wetterdaten und lädt sie auf den Server hoch
"""
import json
import os
import shutil
import subprocess
import sys
from pathlib import Path
import requests
from datetime import datetime
# Konfiguration
API_URL = "http://localhost:8000"
FRONTEND_DIR = Path(__file__).parent / "frontend"
DIST_DIR = FRONTEND_DIR / "dist"
REMOTE_SERVER = "ssh-310927-rxf@sternwarte-welzheim.de" # SSH-Zugang zum Webserver
REMOTE_PATH = "webroot/wetter/wetterstation" # Pfad auf dem Webserver
def fetch_weather_data():
"""Holt aktuelle Wetterdaten von der API"""
try:
response = requests.get(f"{API_URL}/weather/history?hours=24", timeout=10)
response.raise_for_status()
return response.json()
except Exception as e:
print(f"Fehler beim Laden der Daten: {e}")
sys.exit(1)
def build_frontend():
"""Baut das Frontend"""
print("Baue Frontend...")
try:
subprocess.run(
["npm", "run", "build"],
cwd=FRONTEND_DIR,
check=True,
capture_output=True
)
print("✓ Frontend gebaut")
except subprocess.CalledProcessError as e:
print(f"Fehler beim Build: {e.stderr.decode()}")
sys.exit(1)
def inject_data_into_html(weather_data):
"""Fügt Wetterdaten in die index.html ein"""
index_file = DIST_DIR / "index.html"
if not index_file.exists():
print("index.html nicht gefunden!")
sys.exit(1)
with open(index_file, 'r', encoding='utf-8') as f:
html_content = f.read()
# Füge Daten als inline Script vor dem schließenden </body> Tag ein
data_script = f"""
<script>
// Eingebettete Wetterdaten - generiert am {datetime.now().isoformat()}
window.__WEATHER_DATA__ = {json.dumps(weather_data)};
</script>
</body>"""
html_content = html_content.replace('</body>', data_script)
with open(index_file, 'w', encoding='utf-8') as f:
f.write(html_content)
print(f"✓ Daten in HTML eingebettet ({len(weather_data)} Datensätze)")
def upload_to_server():
"""Lädt die Dateien per rsync auf den Server"""
print(f"Lade Dateien auf {REMOTE_SERVER}...")
try:
subprocess.run([
"rsync",
"-avz",
"--delete",
f"{DIST_DIR}/",
f"{REMOTE_SERVER}:{REMOTE_PATH}/"
], check=True)
print(f"✓ Upload erfolgreich")
except subprocess.CalledProcessError as e:
print(f"Fehler beim Upload: {e}")
sys.exit(1)
def main():
print(f"=== Wetterstation Static Generator ===")
print(f"Start: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
# 1. Daten von API holen
print("Lade Wetterdaten...")
weather_data = fetch_weather_data()
print(f"{len(weather_data)} Datensätze geladen\n")
# 2. Frontend bauen
build_frontend()
print()
# 3. Daten in HTML einbetten
inject_data_into_html(weather_data)
print()
# 4. Auf Server hochladen
upload_to_server()
print(f"\n✓ Fertig: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
if __name__ == "__main__":
main()