Face ID for Home Assistant

Names on your camera notifications, from the faces you already tagged in Immich. Detection and matching run on your own machine: no cloud service, no subscription, no face data leaving your network.

InsightFace buffalo_lImmich + pgvector Home AssistantFastAPIPython

From motion to a name

Every motion frame your cameras save is checked automatically, usually within a second on an ordinary CPU.

MotionA camera detects movement and Home Assistant saves a frame.
Face ID serviceInsightFace finds each face and turns it into a 512-number fingerprint.
Match in ImmichThe fingerprint is compared with the people you named in your photo library.
Annotated copyA faces- image with names drawn on it is saved next to the original.
Home AssistantYour notification says who was seen; automations can react to it.

A real example from my front door

The left image is the frame Home Assistant saved. The right one is the copy the service writes next to it.

Front door camera frame before analysis
Original Motion-20261031-173649-268296-front_tree.jpg
The same frame with the recognized face boxed and named
Result faces-20261031-173649-268296-front_tree.jpg
Dadidentified
0.328cosine distance (match if < 0.42)
97 / 100nearest library faces are the same person
0.88face detection confidence
≈ 190 msanalysis time on a CPU (no GPU)

The person shown is the site owner. Any name that was not explicitly allowed is replaced by “Known person”.

The review report

A report lists every image with numbered boxes (green = identified, red = unidentified), a crop of each face, the distance, and the next-best candidate. Below, the same frame is run at two thresholds: the normal one (0.42) identifies the person; a stricter one (0.30) refuses to guess and shows the face as unidentified, with the closest candidate for review. A lower threshold means fewer false matches and more “Unknown”.

Threshold 0.42: identified

All faces identified Motion-20261031-173649-268296-front_tree.jpg home assistant · 2026-10-31 17:36:49
#FacePersonDistanceNext bestDet.
#1face 1Dad0.3280.88

Threshold 0.30: unidentified

Unidentified faces Motion-20261031-173649-268296-front_tree.jpg home assistant · 2026-10-31 17:36:49
#FacePersonDistanceNext bestDet.
#1face 1Unidentified
closest: Dad
0.3280.88

What lands on the phone

Illustration of the Home Assistant notification card after the integration, with the recognition line added.

Motion Analysis: Front_tree

Camera: Front_tree AI Summary: A man is standing at the door of a house.

Recognized: Dad

Notification image
3 minutes ago

Why it is reliable

  • Uses Immich’s own face model, so embeddings are directly comparable.
  • Matches only people you named; unnamed clusters cannot cause a wrong name.
  • Re-detects the Immich database schema automatically after upgrades.
  • Failures never break your automation: it falls back to the original image.
  • On 400 faces from my own library, the default threshold gave about 98.7% precision (an optimistic test, because neighbours often come from the same photo burst).

Built for a smart home

  • Works with any Home Assistant camera, including Blink.
  • Events and sensors in Home Assistant; optional MQTT auto-discovery.
  • API-key protected, input-validated, and tested (100+ automated tests).
  • Daily read-only health check that an AI agent can run and explain.
  • Annotated copies follow your existing retention rules.

Private by default

  • Everything runs on your hardware; nothing is sent to a cloud.
  • Only the faces you tagged in Immich are known.
  • Images are kept only as long as your own retention job keeps them.
  • Not a security or access-control system: no liveness or anti-spoofing checks.