Vogelalbum 1.0.0

Eine Kamera am Vogelhaus, ein Rechner der erkennt wer da war — und eine
Sammlung, die sich von allein fuellt.

Zwei neuronale Netze: eines findet den Vogel im Bild, eines bestimmt die
Art. 148 heimische Arten, auf Deutschland eingeschraenkt und neu normiert —
ohne diese Einschraenkung wird aus einer Kohlmeise eine nordamerikanische
Schwesterart. Daraus entsteht ein Sammelalbum: nummerierte Seiten,
gefundene Arten in Farbe, fehlende als Schatten, dazu Erstfang, Punkte,
Stufen und 15 Abzeichen.

Laeuft vollstaendig auf eigener Hardware. Kein Cloud-Dienst, kein Konto,
keine Telemetrie; die Bilder verlassen das eigene Netz nicht.

Zwei getrennt deploybare Teile: die Sammlung als Django-Anwendung, die
Erkennung als eigener Dienst. Der Erkennungs-Dienst fragt selbst an und
braucht deshalb weder eine erreichbare Adresse noch einen offenen Port —
er laeuft hinter einem gewoehnlichen Router.

Dabei: Firmware fuer Raspberry Pi und ESP32-S3, Anbindung an Home
Assistant ueber MQTT, Oberflaeche auf Deutsch und Englisch, Einstellungen
je Kamera aus dem Browser, und ein Weg fuer Fotos von unterwegs.

AGPL-3.0.
This commit is contained in:
christian committed 2026-10-15 14:30:02 +00:00
commit c11fe9ab04
189 files changed
+29806

No files matched your search

+75
View File
@@ -0,0 +1,75 @@
#
# Fotos bestimmen, die über die App oder das Formular hochgeladen wurden.
#
# 🔑 **Der Dienst holt sich die Arbeit SELBST ab.** Er fragt die Web-App
# jede Minute nach offenen Fotos (GET /api/offen/) und meldet das Ergebnis
# zurück (POST /api/offen/<id>/). Er braucht deshalb weder eine erreichbare
# Adresse noch einen offenen Port — dieselbe Richtung wie bei der
# Fernkonfiguration, und aus demselben Grund: Der Erkennungs-Host steht im
# Heimnetz hinter einem Router, die Web-App nicht.
#
# ⚠️ **Ohne diesen Dienst bleibt JEDES App-Foto unbestimmt liegen.** Die App
# zeigt dann dauerhaft "wird bestimmt …", und zwar ohne Fehler — der Upload
# war ja erfolgreich. Das sieht nach einem Fehler in der App aus und liegt
# auf einer anderen Maschine.
#
# Gehört auf denselben Host wie die Kamera-Detektoren: Dort liegen die
# Modelle und das venv schon.
#
# cp deploy/vogelalbum-warteschlange.service /etc/systemd/system/
# # Zugangsdaten anlegen (chmod 600!):
# cat > /etc/vogelalbum-warteschlange.env <<ENV
# VOGELALBUM_API=https://<deine-instanz>
# VOGELALBUM_TOKEN=<Token einer Kamera -- zum Zurueckmelden>
# VOGELALBUM_LESE_TOKEN=<Lese-Token -- zum Abrufen der offenen Fotos>
# ENV
# chmod 600 /etc/vogelalbum-warteschlange.env
# systemctl enable --now vogelalbum-warteschlange
#
# ✅ **Einmal von Hand auslösen, bevor man sich darauf verlässt**: ein Foto
# hochladen und `journalctl -u vogelalbum-warteschlange -f` mitlesen. Ein
# Dienst, der sauber läuft und nichts tut, sieht im Status genauso aus wie
# einer, der arbeitet.
#
# 🔑 Zum Prüfen ein Bild OHNE Vogel nehmen. Dann durchläuft es die ganze
# Kette, aber es entsteht keine Sichtung — ein Testvogel in einer echten
# Sammlung muss hinterher wieder heraus.
[Unit]
Description=Vogelalbum: Fotos aus der App bestimmen
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=vogelalbum
Group=vogelalbum
WorkingDirectory=/opt/vogelalbum
EnvironmentFile=/etc/vogelalbum-warteschlange.env
Environment=PYTHONUNBUFFERED=1
# --alle 60: Häufiger bringt nichts. Ein gerade hochgeladenes Foto ist beim
# nächsten Durchgang dran, und die App wartet ohnehin mit wachsenden
# Abständen auf das Ergebnis.
ExecStart=/opt/vogelalbum/venv/bin/python -m detector warteschlange --alle 60
Restart=always
RestartSec=15
KillSignal=SIGTERM
TimeoutStopSec=20
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ProtectKernelTunables=true
ProtectControlGroups=true
RestrictSUIDSGID=true
ReadWritePaths=/var/lib/vogelalbum
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target