identity/ (Phase 6, rewritten from the original Node-RED sketch): a
person <-> BLE-identifier registry built directly as a Python service.
Solves multi-phone (multiple identifiers per person), anti-spoofing
(only allowlisted IRK-resolved/fixed-tag entities are ever accepted as
registration candidates, never a raw or randomized MAC), device-less
people (a grandmother without a smartphone gets a no_device registration
plus a hand-operated home/away toggle, reported as "unknown" rather than
a false "away"), and anonymous guests (POST /register/guest, no name
needed). Every person gets an automatic profile picture from their most
recent registration photo. /presence also reports a best-effort room per
person as groundwork for an eventual floor-plan view (not built).
Registration is single-utterance voice ("register me as <name>") or a
touchscreen form; ambiguous/conflicting candidates never auto-commit.
hosts/door-panel/ (Phase 18, new host): structurally kitchen-display's
twin - one Sway workspace, one Chromium kiosk window - defaulting to
identity's weather+clothing/who's-home/groceries-running-low dashboard,
with voice registration as its actual purpose (mic on by default, unlike
every other host's opt-in).
hosts/kitchen-display/: adds opt-in voice satellite and a "Show
registration" screen pointed at identity's register.html, reusing the
same camera-equipped-endpoint registration flow.
pantry-vision/: adds GET /shopping-list (Grocy's own volatile/missing
products, reshaped) for the door panel's "running low" section.
setup-container-host.sh: wires ENABLE_IDENTITY (identity + identity-web,
published like pantry-vision since kiosk browsers call it directly, plus
a persistent SQLite/photos volume unlike pantry-vision's stateless
design) and fixes the HA_URL example to the host's real LAN IP (HA runs
network_mode: host, unreachable by container name - the same situation
Node-RED's own config already documents).
docs/: Phase 6 rewritten, Phase 18 added, hardware/software/guardrail/
open-decision entries throughout project-plan.md and README.md.
components.md gains RuView presence nodes (one per room), fixed BLE tags,
and 2 spare webcams, with the price estimate updated to match.
Nothing here has been run against real hardware, a real HA instance, or
real Private BLE Device entities - TRUSTED_ENTITY_PREFIXES above all
needs checking against a live instance before registration finds
anything. See identity/README.md and hosts/door-panel/README.md for the
itemized verification lists.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K6CrKjW3yVptUnjG35HjC1
|
||
|---|---|---|
| admin-canvas | ||
| digest-engine | ||
| docs | ||
| firmware/esp32-s3-touch-lcd-1.85c | ||
| hosts | ||
| identity | ||
| pantry-vision | ||
| .gitignore | ||
| README.md | ||
README.md
AI-Managed Smart Home
Local-first, open-source smart home: Home Assistant + Zigbee + RuView (CSI presence)
- Bermuda (BLE identity) + local LLM (Ollama) + Frigate (peephole face recognition)
- Grocy (kitchen kiosk) + Nextcloud calendar sync + a Sway thin-client media station
- a Sway touch panel + a camera-vision kitchen/fridge display + a voice/touch identity-registration door panel + a quarter-daily LLM-generated digest.
See docs/project-plan.md for the full hardware list,
software stack, and phased implementation plan.
Repo layout
docs/ Project plan and design notes
hosts/
container-host/ Docker Compose stack: HA, Mosquitto, Zigbee2MQTT,
Frigate, Grocy, Node-RED, monitoring, etc.
configs/ Per-service config files (mosquitto.conf, etc.)
scripts/ Host setup / bootstrap scripts
llm-host/ Ollama + GPU host setup (separate physical machine)
thin-client/ Sway kiosk/media-station ISO (live-build) + thinclient-agent
audio-endpoint/ Headless Spotify Connect appliance for rooms with no thin
client — arm64 (rpi-image-gen) + amd64 (live-build) images
touch-panel/ Touch-driven Sway panel: full Spotify GUI, a dedicated
Home Assistant Chromium kiosk window, and a general web
browser, switched via an always-on touch dock or by HA/
the local LLM over MQTT
kitchen-display/ Single-purpose Sway kiosk for the fridge/pantry: one
Chromium window showing pantry-vision's Scan/Inventory/
Recipes frontend, camera capture via the browser itself
door-panel/ Single-purpose Sway kiosk by the door/wardrobe:
identity's weather+clothing/who's-home/groceries-low
dashboard by default, registration on demand — this
host's twin relationship to kitchen-display, but the
mic is the point here, not an opt-in edge case
firmware/
ruview/ RuView ESP32-S3 CSI presence node configs
esphome-ble-proxy/ ESPHome configs for Bermuda BLE proxy nodes
esp32-s3-touch-lcd-1.85c/ ESPHome voice satellite + status display (round LCD,
media/cover-art priority over an idle weather/time/
date cycle, voice-state visualizer)
identity/ Person <-> BLE-identifier registry: multi-phone support,
anti-spoofing (allowlisted IRK-resolved/fixed-tag
entities only, never a raw MAC), voice/touch
registration, presence resolution (write API +
frontend/ static serving, consumed by kitchen-display
and door-panel)
digest-engine/ Quarter-daily LLM digest: mail/message/news/financial
ingestion, LLM synthesis, digest-canvas SDK rendering
admin-canvas/ On-demand sys-admin-llm display surface for the thin
clients: stats/graphics/media, pushed on demand
rather than on a schedule (write API + admin-web
static serving)
pantry-vision/ Kitchen-display backend: a photo held up to the camera
-> an Ollama vision-model proposal -> human-confirmed
write into Grocy stock; also proxies Grocy's inventory
(soonest-expiring first) and recipes to the kiosk
frontend (write API + frontend/ static serving)
Status
- Project plan drafted
- Container host setup script v1 (HA, Mosquitto, Zigbee2MQTT USB, Frigate, Grocy)
- Node-RED + monitoring (Netdata) + dashboard (Homepage) + ntfy + Portainer added to compose stack
- Backup (restic) setup — scripted, off by default until a backup target is picked (
ENABLE_BACKUPS) - Bermuda / ESPHome BLE proxy configs
- RuView node configs
- Frigate peephole camera config (real RTSP details)
- Grocy kiosk (Pi + touchscreen) setup
- LLM host (Ollama) setup script
- CalDAV / Nextcloud calendar integration notes
- Sway thin-client ISO (live-build) + thinclient-agent — built, not yet boot-tested on real hardware; RDP replaced by wayvnc (resolved), remaining open items (mic-enabled rooms, exact hardware target, wayvnc password provisioning) in
docs/project-plan.md§4 - Thin-client follow-ups in progress: fullscreen-aware now-playing widget (cover art + controls), minimal Firefox chrome + uBlock Origin/SponsorBlock, persistent audio-output selection, outbound RDP/VNC client (
rdp-vnc.json), HA mobile-app browser remote control (text input + mouse buttons), capture-card ("receiver box") video source selection on a new5:captureworkspace, idle-gallery weather/clock overlay (clock always, weather via a newsmarthome/weather/currentMQTT topic an HA automation has to publish) — built, not yet tried against real capture-card hardware or a real weather automation, seehosts/thin-client/README.md - Quarter-daily digest engine (mail/Signal/Telegram/Discord/WhatsApp, news, financial ingestion; LLM synthesis; digest-canvas SDK) — built and wired into
setup-container-host.sh(ENABLE_DIGEST_ENGINE, off by default), not yet run against real credentials; household/calendar ingest (CalDAV/Grocy) still needs a real data source wired in, seedocs/project-plan.md§4 - admin-canvas + admin-web (sys-admin-llm on-demand display surface for the thin clients) — built and wired into
setup-container-host.sh(ENABLE_ADMIN_CANVAS, off by default); the HA-side tool/rest_command wiring and the specific entities it surfaces (e.g. power-monitoring) are still undecided, seedocs/project-plan.md§4 - ESP32-S3-Touch-LCD-1.85C-V2 voice satellite + status display (
firmware/esp32-s3-touch-lcd-1.85c/) — ESPHome config written and passesesphome config, not yet flashed to real hardware;media_player/weatherentity IDs still need to be chosen, seedocs/project-plan.md§4 - Headless audio endpoint (
hosts/audio-endpoint/) — per-room independent Spotify Connect appliance for rooms without a thin client, arm64 (Raspberry Pi + HiFiBerry Amp2, rpi-image-gen) and amd64 (mini PC + USB DAC/amp, live-build) build pipelines written, neither built/flashed/booted on real hardware — rpi-image-gen's exact config schema in particular is unverified, seehosts/audio-endpoint/README.md - Sway touch panel (
hosts/touch-panel/) — touch-driven Sway image: full Spotify GUI (Flathub), a dedicated Home Assistant Chromium kiosk window, a general web browser, an always-on touch dock for app switching, an on-screen keyboard (toggled manually, no auto-show), andtouchpanel-agent(HA MQTT control, same LLM-mediated-through-HA security model as the thin client) — built, no touch-panel hardware chosen and nothing booted on real metal, seehosts/touch-panel/README.md - Kitchen/fridge display +
pantry-vision(hosts/kitchen-display/,pantry-vision/) — hold a grocery item up to the camera, an Ollama vision model proposes what it is and roughly how long it keeps, a human confirms (never auto-committed) before it's written into Grocy stock; the display then shows inventory sorted by soonest-to-expire, groceries running low, and Grocy's recipes — built and wired intosetup-container-host.sh(ENABLE_PANTRY_VISION, off by default), nothing run against a real camera, vision model, or Grocy instance — the Grocy API call shapes in particular are written from documentation only, seepantry-vision/README.mdandhosts/kitchen-display/README.md identity+ door panel (identity/,hosts/door-panel/) — the person <-> BLE-identifier registry: "register me as<name>" by voice or touchscreen, multi-phone support (multiple identifiers per person), anti-spoofing (only allowlisted IRK-resolved/fixed-tag entities are ever accepted as candidates, never a raw MAC), device-less people (a "no device" flag plus a hand-operated Home/Away toggle — the concrete case: a grandmother without a smartphone), and an anonymous "Guest" path. Backshosts/door-panel/'s weather+clothing/who's-home/groceries-running-low dashboard andhosts/kitchen-display/'s "Show registration" screen — built and wired intosetup-container-host.sh(ENABLE_IDENTITY, off by default), nothing run against a real HA instance, real Private BLE Device entities, or a real voice pipeline —TRUSTED_ENTITY_PREFIXESabove all needs checking against Developer Tools -> States, seeidentity/README.mdandhosts/door-panel/README.md
Quick start
cd hosts/container-host/scripts
sudo ./setup-container-host.sh
Edit the variables at the top of the script first (timezone, Zigbee USB device
path, Mealie/hardware-accel toggles, and whether to enable Node-RED/Netdata/
Homepage/ntfy/Portainer and restic backups — all but backups are on by
default). See docs/project-plan.md for the full phased rollout order — don't
skip straight to Phase 4+ automations before the Phase 2 reactive baseline
(presence -> light, no LLM in the loop) is working.
The script brings up everything that runs on this one Debian host: Home
Assistant, Mosquitto, Zigbee2MQTT, Node-RED, Frigate, Grocy, Netdata, a
Homepage dashboard, ntfy, and Portainer, plus an optional scheduled restic
backup timer and an optional quarter-daily digest engine (ENABLE_DIGEST_ENGINE,
off by default — needs digest-engine/ checked out on the host and its .env
filled in first, see digest-engine/README.md). What it can't do for you,
because they need separate hardware, credentials, or physical setup: pairing
Zigbee sensors, flashing RuView/ESPHome/Bermuda BLE proxy boards, pointing
Frigate at a real camera RTSP URL, the Grocy kiosk touchscreen, the separate
LLM/GPU host, wiring up the Nextcloud CalDAV integration, building/flashing
the thin-client ISO (hosts/thin-client/), and provisioning real credentials
for the digest engine's mail/message/news/financial sources — see the Status
checklist above and docs/project-plan.md for those.