Grafik 2 spaltig auch bein iFrame
Übertragen nach sternwarte funktioniert
This commit is contained in:
112
generate-static.py
Executable file
112
generate-static.py
Executable file
@@ -0,0 +1,112 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user