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-14 18:55:23 +00:00
commit cc9e0786c2
189 files changed
+29792

No files matched your search

+38
View File
@@ -0,0 +1,38 @@
"""Steckbriefe für die erweiterten Arten, nach Gruppen aufgeteilt.
Eine einzige Datei mit 104 Einträgen wäre unwartbar. Die Aufteilung folgt
nicht der Systematik, sondern der Frage, wie wahrscheinlich eine Art vor der
Kamera landet:
* ``gaeste`` — Gartenvögel und alles, was über den Garten fliegt
* ``land`` — Singvögel, Greifvögel, Eulen und Exoten des Landes
* ``wasser`` — Wat-, Wasser- und Meeresvögel
Doppelte Schlüssel sind ein Fehler und werden beim Import gemeldet, nicht
stillschweigend überschrieben — sonst gewinnt zufällig die zuletzt geladene
Datei.
"""
from __future__ import annotations
from .basis import Zusatz
from . import gaeste, land, wasser
_MODULE = (gaeste, land, wasser)
INFO_EXTRA: dict[str, Zusatz] = {}
_doppelt: dict[str, list[str]] = {}
for _modul in _MODULE:
for _slug, _eintrag in _modul.PROFILE.items():
if _slug in INFO_EXTRA:
_doppelt.setdefault(_slug, []).append(_modul.__name__)
INFO_EXTRA[_slug] = _eintrag
if _doppelt:
raise ImportError(
"Steckbriefe doppelt vergeben: "
+ ", ".join(f"{k} ({', '.join(v)})" for k, v in _doppelt.items())
)
__all__ = ["INFO_EXTRA", "Zusatz"]