(Ü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.
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.
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
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:
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.
Das war einfach, da direkt vor dem Futterhaus einige Blumenkästen sind, wo ich die Kamera montiert habe

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"...)
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.
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.
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.
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.

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.
Nachdem ein Ereignis empfangen wurde, wird das Bild heruntergeladen und eine Nachricht wird unter Verwendung von MastoNet an Mastodon gesendet: