87 lines
2.5 KiB
Python
87 lines
2.5 KiB
Python
#!/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)
|