#!/usr/bin/env bash # ============================================================================== # setup-garmin-cron.sh # Declaratively registers the Garmin Connect Nightly Sync in OpenClaw. # Schedule: Daily at 03:30 Europe/Berlin (cron: 30 3 * * *) # ============================================================================== set -euo pipefail NAMESPACE="${NAMESPACE:-openclaw}" POD_NAME="${POD_NAME:-openclaw-0}" CONTAINER_NAME="${CONTAINER_NAME:-openclaw}" JOB_NAME="garmin-nightly-mirror" CRON_SCHEDULE="30 3 * * *" TIMEZONE="Europe/Berlin" TELEGRAM_GROUP="-1004326921510" TELEGRAM_TOPIC="20" echo "=== Registering Garmin Connect Nightly Sync in OpenClaw ($POD_NAME) ===" # 1. Check if job already exists EXISTING_ID=$(kubectl exec -n "$NAMESPACE" "$POD_NAME" -c "$CONTAINER_NAME" -- openclaw cron list --json 2>/dev/null | python3 -c 'import sys, json; data=json.load(sys.stdin); print(next((j["id"] for j in data.get("jobs", []) if j.get("declarationKey") == "'"$JOB_NAME"'" or j.get("name") == "'"$JOB_NAME"'"), ""))' 2>/dev/null || true) if [ -n "$EXISTING_ID" ]; then echo "Found existing job with ID $EXISTING_ID. Removing for idempotent recreation..." kubectl exec -n "$NAMESPACE" "$POD_NAME" -c "$CONTAINER_NAME" -- openclaw cron rm "$EXISTING_ID" || true fi # 2. Add the job echo "Creating automation $JOB_NAME ($CRON_SCHEDULE @ $TIMEZONE)..." MESSAGE=$(cat << 'EOF' Führe den nächtlichen Garmin Connect Sync durch. Vorgehen: 1. Führe den Garmin-Sync-Befehl aus: uv run /home/node/mop-skills/mop-skills/skills/datastore/scripts/garmin_sync.py --days 2 --data-dir /home/node/.openclaw/wiki/main/data 2. Aktualisiere die gerenderten Markdown-Ansichten: PYTHONPATH=/home/node/mop-skills/mop-skills/skills/datastore/scripts uv run /home/node/mop-skills/mop-skills/skills/datastore/scripts/render_views.py --data-dir /home/node/.openclaw/wiki/main/data --wiki-dir /home/node/.openclaw/wiki/main 3. Aktualisiere das persönliche Health & Nutrition Dashboard (moritz.html): uv run /home/node/mop-skills/mop-skills/skills/datastore/scripts/update_moritz_website.py --data-dir /home/node/.openclaw/wiki/main/data 4. Git Commit & Push im Knowledge Wiki: cd /home/node/.openclaw/wiki/main && git add data/garmin/ entities/nutrition-log/ public/ && git diff --staged --quiet || (git commit -m "chore(garmin): automated nightly mirror [skip ci]" && git push origin main) 5. Finale Antwort: - Bei Erfolg: Gib exakt 'NO_REPLY' aus (intentional silence, kein Telegram-Spam in der Nacht). - Nur bei Authentifizierungsfehlern: Informiere kurz via Telegram (Thema #Sport), dass ein Garmin-Re-Auth nötig ist, oder starte den Re-Auth-Flow. EOF ) kubectl exec -n "$NAMESPACE" "$POD_NAME" -c "$CONTAINER_NAME" -- openclaw cron add \ --name "$JOB_NAME" \ --declaration-key "$JOB_NAME" \ --description "Nächtlicher deterministischer Spiegel der Garmin Connect Daten (Aktivitäten, Daily Summary, Schlaf) in Git JSONL" \ --cron "$CRON_SCHEDULE" \ --tz "$TIMEZONE" \ --agent "fitness" \ --model "openrouter/deepseek/deepseek-v4.1-flash" \ --session "isolated" \ --channel "telegram" \ --to "$TELEGRAM_GROUP" \ --thread-id "$TELEGRAM_TOPIC" \ --announce \ --message "$MESSAGE" echo "=== Automation successfully registered! ===" kubectl exec -n "$NAMESPACE" "$POD_NAME" -c "$CONTAINER_NAME" -- openclaw cron list | grep "$JOB_NAME" || true