Ü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.

Home-Assistant-Pushbenachrichtigung der Mobotix-Türklingel mit aktuellem Kamerabild

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 18425 auf 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_URL lä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.