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,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"]
|
||||
Reference in new issue
Block a user