(Übersetzt aus dem Englischen: /en/squirrel )

[Hinweis: Dies ist nicht als Tutorial gedacht, sondern eher als Plauderei. Du findest den Quellcode trotzdem auf GitHub, aber ich gehe davon aus, dass dies ein SEHR spezieller Anwendungsfall ist, den sonst niemand nutzt]

Lass mich zu Beginn sagen, dass dieses ganze Projekt völliger Unsinn ist. Niemand braucht diese Funktion wirklich. Ich habe mich trotzdem entschieden, es zu erstellen.

Das Ziel

Ich besitze eine kleine Futterstelle für die Eichhörnchen aus der Nachbarschaft. Und sie funktioniert wie gedacht: Eichhörnchen kommen her, stehlen ihr Futter und laufen weg.

Ich kann sie durch meine Glastür sehen und es sieht einfach toll aus, besonders bei typischem "Hamburger Wetter" (bedeutet: horizontal regnend). Manchmal mache ich ein Foto oder sogar ein Video, aber durch die Tür sieht das einfach nicht sehr gut aus.

Also beschloss ich, eine Überwachungskamera hinzuzufügen, und wenn ich schon dabei bin: Automatisch zu veröffentlichen, wenn ein Eichhörnchen erscheint.

Hardware

Ich benutze eine dlink-Außenkamera mit WLAN. Die Modellnummer ist hier nicht wirklich relevant, einfach die günstigste WLAN-Kamera, die ich finden konnte und die mit der Synology Surveillance Station kompatibel ist (aber fast alle sind es)

Zusätzlich die Synology NAS mit installierter Surveillance Station. Ich besitze eine DS920+, aber jede sollte funktionieren

Datenschutz

Ich möchte keine Personen verfolgen. Weder mich noch andere. Dies soll keine Überwachung sein, es soll Eichhörnchen filmen. Um ehrlich zu sein, habe ich die Eichhörnchen nicht gefragt, was sie über Datenschutz und DSGVO denken, aber ich nehme an, sie sind damit einverstanden. Immerhin haben sie bisher allen Cookies zugestimmt, und nicht nur den erforderlichen.

Um sicherzustellen, dass nur Eichhörnchen (oder andere Tiere) erfasst werden, wollte ich einige Bedingungen festlegen:

  • Nur Bewegungen direkt vor dem Futterhaus verfolgen.
    • So kann ich sicherstellen, dass keine Menschen oder Verkehr im Hintergrund den Bewegungssensor auslösen
  • Die Kamera in "Eichhörnchen"-Höhe platzieren.
    • So können selbst wenn jemand (ich oder meine Gäste) den Alarm auslöst, keine Gesichter gesehen werden
  • Einen einfach zu bedienenden Freigabe-Workflow haben
    • Nur für den Fall. Wenn jemand betrunken dort liegt, möchte ich kein Video dieser Person irgendwo veröffentlichen

Nur Bewegungen direkt vor dem Futterhaus verfolgen

Das ist einer der Gründe, warum ich die Surveillance Station von Synology verwende. Die Kamera selbst hat eine Bewegungserkennung und (laut Dokumentation) sogar einen ausgefallenen KI-"das ist eine Person"-Algorithmus. Ich möchte Letzteres aus offensichtlichen Gründen nicht und kann besonders nicht entscheiden, welcher Bildbereich für die Erkennung verwendet werden soll.Außerdem scheint dies eine Cloud-Funktion zu erfordern. Ich möchte meine Kamera-Feeds von niemandem in der Cloud haben. Dies sollte niemals ohne meine Zustimmung mein Haus verlassen. Die Surveillance Station kann sehr kleine Bildausschnitte als Alarmzonen auswählen. Ich habe sie direkt vor dem Futterhaus platziert, wo keine Hintergrundbewegungen erkannt werden können. Auf diese Weise kann ich auch die Empfindlichkeit der Erkennung auf einen ziemlich hohen Wert einstellen, da keine Störungen durch sich im Wind bewegende Zweige etc. zu erwarten sind.

Die Kamera in Eichhörnchen-Höhe platzieren

Das war einfach, da direkt vor dem Futterhaus einige Blumenkästen sind, wo ich die Kamera montiert habe Foto vom Garten. Ein Eichhörnchen-Futterhaus im Hintergrund, die Kamera vorne

Einen einfachen Freigabe-Workflow haben

Da ich zum Zeitpunkt dieses Schreibens hauptsächlich bei Mastodon bin (diese Sätze altern manchmal sehr schlecht. Vor ein paar Monaten wäre das der Künstler früher bekannt als Twitter gewesen, der selbst nur ein Ersatz für Google+ war, was, nun ja, du kennst die traurige Geschichte). Hoffen wir einfach, dass das mein letzter Social Media-Wechsel war.

Einer der Vorteile von Mastodon ist, dass es eine sehr schöne, einfache API hat, die das Senden von Toots, Empfangen von Benachrichtigungen usw. ermöglicht. Meine Idee für den Workflow ist also, mich (und nur mich) zu benachrichtigen, dass eine neue Bewegung erkannt wurde. Ein Bild dieser Bewegung anhängen und wenn ich dies genehmige (z.B. durch Hinzufügen eines "Favs" zu diesem Toot), weiß der Bot, dass diese Erkennung ein gültiges Eichhörnchen-Video war und postet es. Also KI ohne das "K". (manche würden sogar argumentieren ohne das "I"...)

Synology

Das Hinzufügen der Webcam ist ziemlich einfach. Sie wird in der Surveillance Station fast automatisch gefunden. Herauszufinden, wie man sich verbindet, war etwas schwieriger. Der Benutzername ist immer "admin" und das erforderliche Passwort ist eine PIN. Aufgedruckt auf dem Netzteil, nicht auf dem Gerät... Danach mag die App der Kamera die Kamera nicht mehr, was für mich ein Bonus ist, da ich sowieso nicht möchte, dass Bilder zu dlink hochgeladen werden.

Der Erkennungsbereich kann in den Kamera-Optionen eingestellt werden. Screenshot von "Bewegungserkennungsbereich" in der Surveillance Station Das Herumspielen mit den Schwellenwerten dauert eine Weile, besonders da ich kein trainiertes Eichhörnchen habe, das mir dabei hilft. Ich habe dann den Zeitplan auf ständige Bewegungserkennung geändert (also die konstante Aufnahme deaktiviert) und die minimale Aufnahmezeit auf fünf Minuten aktualisiert. Ein guter Kompromiss zwischen allem aufnehmen und nicht zu große Videos für Mastodon/YouTube/wo auch immer ich das hochladen wollte, was ich zu diesem Zeitpunkt noch nicht entschieden hatte.

Synology hat mehrere Möglichkeiten, über Bewegungen zu benachrichtigen: E-Mail, SMS, Push-Benachrichtigungen und Webhooks. Offensichtlich war Letzteres der richtige Weg, da es mich inkeiner Weise zuspammt und ich sowieso programmieren muss.

Einen Webhook schreiben

Alt text Ein Webhook ist im Wesentlichen nur ein HTTP-Aufruf. Synology erlaubt POST und PUT in der Surveillance Station. Also erstellte ich eine einfache Web API in Visual Studio und war bereit, die eingehenden Daten zu debuggen.

Firewalls, Firewalls überall!

Synology erlaubt es, eine Test-Benachrichtigung zu senden, die nur in einem Fehler resultierte. WAS genau schief ging, ist nirgendwo zu sehen. Weder in der Surveillance Station noch in den Logs von Synology. Also musste ich an dieser Stelle im Dunkeln tappen.

Ich wusste, dass es funktionierte, wenn ich meinen lokalen Rechner verwendete, entweder über localhost oder die IP-Adresse meiner Entwicklungsmaschine.

Also war der nächste Schritt, mich via SSH mit meiner Synology zu verbinden und zu versuchen, auf meine API durch einen einfachen Webaufruf via GET zuzugreifen: wget https://192.168.178.23:6789/ping

Dieser einfache Aufruf funktionierte bereits nicht. Also musste es ein Firewall-Problem sein. Ich überprüfte alles in meiner Synology-Konfiguration FÜR EINE SEHR LANGE ZEIT und fand nichts. Schließlich richtete ich meine Aufmerksamkeit auf Windows, deaktivierte die Defender-Firewall und es ging durch. Da ich die Firewall nicht offen haben möchte, fügte ich eine Ausnahme durch "Eine App durch die Windows-Firewall zulassen" hinzu und endlich funktionierte es mit aktivierter Firewall. Windows Firewall-Regeln

Daten vom Webhook empfangen

Der Webhook kam wie erwartet an, hat einige Informationen darin und kann sogar eine URL zu einem Vorschaubild bereitstellen. Diese Bild-URL ist eine generierte "öffentliche" (innerhalb meines LANs) Adresse, die ich empfangen und herunterladen kann:

app.MapPost("/squirrel", async context =>
{
    var requestBody = await context.Request.ReadFromJsonAsync<SynologyBody>();
    if (requestBody != null)
    {
        if (!string.IsNullOrWhiteSpace(requestBody.Capture))
        {
            var previewImage = await downloader.DownloadFile(requestBody.Capture);                                    
        }
        else
        {
            Console.WriteLine("received event without image. Will ignore it");
        }
    }
    await context.Response.WriteAsync("event received");
});

public class SynologyBody {
  public string Subject { get; set; } 
  public string Desc { get; set; } 
  public string Capture { get; set; } 
}

(Synology kümmert sich nicht wirklich um die Antwort, aber ich fand es beim lokalen Testen durch Postman nützlich)

An diesem Punkt habe ich noch kein Video, was zu erwarten ist, da "normale" Benutzer erwarten würden, die Warnung sofort zu erhalten und nicht fünf Minuten nachdem jemand ihre Nüsse gestohlen hat.

Private Benachrichtigung an Mastodon senden

Nachdem ein Ereignis empfangen wurde, wird das Bild heruntergeladen und eine Nachricht wird unter Verwendung von MastoNet an Mastodon gesendet: