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:
commit
c11fe9ab04
189 files changed
+29806
No files matched your search
@@ -0,0 +1,70 @@
|
||||
# Ein Detector je Kamera. Der Name hinter dem @ waehlt die Umgebungsdatei:
|
||||
#
|
||||
# systemctl enable --now vogelalbum-detector@futterhaus
|
||||
# -> liest /etc/vogelalbum-futterhaus.env
|
||||
#
|
||||
# Genau so vorgeschlagen im Kopf von vogelalbum-detector.service, umgesetzt am
|
||||
# 24.09.2026 beim Aufsetzen von LXC 112.
|
||||
#
|
||||
# Zugangsdaten je Kamera in /etc/vogelalbum-<name>.env (chmod 600, root:root):
|
||||
# VOGELALBUM_SOURCE=http://vogelkamera.local:8080/stream
|
||||
# VOGELALBUM_API=http://sammlung.local:8000
|
||||
# VOGELALBUM_TOKEN=<Token aus dem Backend>
|
||||
# VOGELALBUM_SAVE_TO=/var/lib/vogelalbum/<name>/rohdaten
|
||||
# VOGELALBUM_LIVE_PORT=8131
|
||||
# VOGELALBUM_KLASSIFIZIERE=2
|
||||
#
|
||||
# 🔑 Ein Dienst je Kamera und nicht einer fuer beide: Der Detector liest
|
||||
# genau einen Bildstrom. Abwechselnd zu lesen hiesse, die Aufmerksamkeit je
|
||||
# Kamera zu halbieren -- und an der Traenke ist ein Vogel womoeglich kuerzer
|
||||
# da als am Futterhaus.
|
||||
|
||||
[Unit]
|
||||
Description=Vogelalbum-Detector fuer Kamera %i
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=vogelalbum
|
||||
Group=vogelalbum
|
||||
WorkingDirectory=/opt/vogelalbum
|
||||
EnvironmentFile=/etc/vogelalbum-%i.env
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
|
||||
# Die Schwellwerte stehen bewusst hier und nicht im Code: sie gehören zur
|
||||
# Kamera, nicht zum Programm. 'gate detector' ignoriert Bewegung — nötig,
|
||||
# weil unsere Kamera auf eine Hecke schaut, die im Wind steht.
|
||||
# --nachtsicht ergaenzen, wenn die Kamera Infrarot hat. Ohne den Schalter
|
||||
# pausiert die Analyse, sobald das Bild zu dunkel zum Erkennen ist.
|
||||
ExecStart=/opt/vogelalbum/venv/bin/python -m detector watch \
|
||||
--gate detector \
|
||||
--classify-every ${VOGELALBUM_KLASSIFIZIERE} \
|
||||
--cooldown 5 \
|
||||
--min-bird-frames 1 \
|
||||
--verbose
|
||||
|
||||
# Der Stream reißt nachts gern mal ab; einfach wieder hochkommen.
|
||||
Restart=always
|
||||
RestartSec=15
|
||||
|
||||
# ⚠ Die Kameras lassen nur EINEN Zuschauer zu. Beim Neustart muss der alte
|
||||
# Prozess seine Verbindung erst loslassen, sonst bekommt der neue nichts.
|
||||
KillSignal=SIGTERM
|
||||
TimeoutStopSec=20
|
||||
|
||||
# Ein Bilderkenner braucht weder Schreibzugriff aufs System noch neue Rechte.
|
||||
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
|
||||
Reference in new issue
Block a user