diff --git a/run_frigate_report.sh b/run_frigate_report.sh new file mode 100755 index 0000000..feb55a8 --- /dev/null +++ b/run_frigate_report.sh @@ -0,0 +1,13 @@ +#!/bin/bash +cd /home/marc/bot-deploy + +# Generate report +REPORT=$(python3 src/frigate_report.py) + +# Send to Telegram via Hermes +echo "$REPORT" | hermes send-message telegram --message-file /dev/stdin || true + +# Also save to log +echo "[$(date)]" >> /tmp/frigate-reports.log +echo "$REPORT" >> /tmp/frigate-reports.log +echo "" >> /tmp/frigate-reports.log diff --git a/src/frigate_report.py b/src/frigate_report.py new file mode 100644 index 0000000..200c994 --- /dev/null +++ b/src/frigate_report.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 +""" +Frigate Daily Report Generator +Sends to Telegram every evening at 20:30 CET +""" +import os, json, requests +from datetime import datetime, timedelta +from collections import defaultdict + +FRIGATE_URL = "http://localhost:5000" + +def get_frigate_events(): + """Get events from last 24 hours""" + try: + resp = requests.get(f"{FRIGATE_URL}/api/events", timeout=5) + events = resp.json() + + # Filter for last 24h + now = datetime.now().timestamp() + yesterday = now - (24 * 3600) + + recent = [e for e in events if e.get('start_time', 0) > yesterday] + return recent + except Exception as e: + print(f"Error fetching events: {e}") + return [] + +def generate_report(): + """Generate Frigate daily summary""" + events = get_frigate_events() + + if not events: + return "šŸŽ„ **Frigate Daily Report** — Keine Events heute\n\nStatus: āœ… Alle Kameras aktiv\nEvents: 0" + + # Group by camera & label + by_camera = defaultdict(lambda: defaultdict(int)) + by_label = defaultdict(int) + people = set() + + for event in events: + camera = event.get('camera', 'Unknown') + label = event.get('label', 'Unknown') + sub_label = event.get('sub_label', None) + + by_camera[camera][label] += 1 + by_label[label] += 1 + + if label == 'person' and sub_label: + people.add(sub_label) + + # Format report + timestamp = datetime.now().strftime('%Y-%m-%d %H:%M CET') + report = f"""šŸŽ„ **Frigate Daily Report** — {timestamp} + +šŸ“Š **ZUSAMMENFASSUNG** +• Gesamt Events: {len(events)} +• Detektierte Personen: {len(people)} +• Kameras aktiv: {len(by_camera)} + +šŸ‘„ **Erkannte Personen** +""" + + for person in sorted(people): + report += f" • {person}\n" + + report += f"\nšŸ“¹ **Nach Kamera**\n" + + for camera in sorted(by_camera.keys()): + events_count = sum(by_camera[camera].values()) + labels = ", ".join(by_camera[camera].keys()) + report += f" 🟢 {camera}: {events_count} Events ({labels})\n" + + report += f"\nšŸ·ļø **Nach Objekttyp**\n" + + for label in sorted(by_label.keys()): + count = by_label[label] + report += f" • {label.upper()}: {count}\n" + + report += f"\nāœ… **Status**: Alle Kameras aktiv\n" + report += f"*Report: {datetime.now().strftime('%H:%M:%S UTC')}*" + + return report + +if __name__ == "__main__": + report = generate_report() + print(report)