Überblick¶
Die Mobotix T25 an der Haustür kann bei Bewegung eine HTTP-Benachrichtigung mit dem aktuellen Kamerabild verschicken. Nur: Home Assistant nimmt diese Requests nicht sauber an – die Kamera sendet ein Multipart-Format, das mal keinen Content-Length-Header hat, mal HTTP/1.0 spricht und den Body einfach per Verbindungsabbruch beendet.
Dieses kleine Relay sitzt dazwischen: Es empfängt den Multipart-POST der Kamera, speichert das Bild, baut die Anfrage mit korrektem Boundary und Content-Length neu auf und leitet sie an einen Home-Assistant-Webhook weiter. Ergebnis: eine Push-Benachrichtigung aufs Handy mit dem Alarmbild.
Motivation¶
Viele Kamera-Ökosysteme wollen einen in die Cloud zwingen. Die Mobotix kann von Haus aus lokal per HTTP benachrichtigen – der einzige Haken war die Inkompatibilität ihres Multipart-Formats mit modernen HTTP-Servern. Statt eine Cloud-Bridge zu nutzen, war mir ein schlanker, lokaler Übersetzer lieber: ein Container, kein Account, keine Cloud.
Architektur¶
Das Relay ist bewusst minimal:
- Eingang: lauscht auf Port
18425auf den Multipart-POST der Kamera - Bild: nimmt das erste Part mit
image/*Content-Type (JPEG/PNG/GIF/WebP werden auch per Datei-Signatur erkannt) und legt es in einem Docker-Volume ab - Weiterleitung: baut den Request neu auf und schickt Textfelder + Bild-URL an den HA-Webhook
- Bild-URL: wird automatisch aus dem Host der eingehenden Anfrage abgeleitet; ein
PUBLIC_BASE_URLlässt sich für Reverse-Proxy/HTTPS überschreiben
Besonderheit: Das Relay versteht auch das native mxmsg/2.2-Format der T25 – also HTTP/1.0 ohne Content-Length, per Connection-Close terminierte Bodies und MIME-Parts ohne Content-Disposition.
In Home Assistant verfügbar¶
Der Webhook liefert die Multipart-Daten als Template-Variablen:
| Template | Wert |
|---|---|
trigger.data.message |
Von der Kamera gelieferte Nachricht |
trigger.data.image_url |
URL des gespeicherten Bildes |
trigger.data.source_ip |
IP-Adresse der Kamera |
trigger.data.received_at |
Empfangszeit (ISO-Format) |
Eine simple Automation nutzt notify.mobile_app_..., um Titel, Nachricht und Bild als Push zu verschicken.
alias: Mobotix Front Door
description: Sends a notification with the image received from the T25
triggers:
- trigger: webhook
webhook_id: YOUR_LONG_RANDOM_WEBHOOK_ID
allowed_methods:
- POST
local_only: true
conditions: []
actions:
- action: notify.mobile_app_YOUR_PHONE
data:
title: Front door
message: >-
{{ trigger.data.message | default('Motion detected', true) }}
data:
image: "{{ trigger.data.image_url }}"
mode: queued
max: 10
Betrieb¶
Aufgesetzt wird alles per Docker Compose:
cp .env.example .env
docker compose up -d --build
Ein /healthz-Endpoint ({"status":"ok"}) macht den Zustand für Compose-Healthchecks und Monitoring prüfbar.
Lessons Learned¶
- Nicht jede Kamera spricht sauberes HTTP – ein 100-Zeilen-Relay spart den Cloud-Zwang.
- Multipart ist tückisch: fehlender
Content-Length, exotische Boundaries und Connection-Close-Bodies muss man explizit abfangen. - Bild-Signaturen sind robuster als sich auf den vom Gerät gemeldeten Content-Type zu verlassen.