{"id":5187,"date":"2026-06-08T13:22:36","date_gmt":"2026-06-08T13:22:36","guid":{"rendered":"https:\/\/www.creatingsmarthome.com\/?p=5187"},"modified":"2026-06-08T14:17:00","modified_gmt":"2026-06-08T14:17:00","slug":"building-a-cloud-free-security-analyst-home-assistant-and-local-vision-ai","status":"publish","type":"post","link":"https:\/\/www.creatingsmarthome.com\/index.php\/2026\/06\/08\/building-a-cloud-free-security-analyst-home-assistant-and-local-vision-ai\/","title":{"rendered":"Building a Cloud-Free Security Analyst: Home Assistant and Local Vision AI"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">If you run a local smart home, you probably share my biggest frustration with security footage: the manual review process. Waking up to a list of motion alerts means wasting time checking if the trigger was a valid security concern or just a familiar face, like my son driving home late. I wanted to completely automate this with AI, but finding a tool that bridged <strong>Unifi Protect<\/strong> and <strong>Home Assistant<\/strong>\u2014while keeping all data strictly local and cloud-free\u2014proved impossible. So, I wrote the software myself. Welcome to Marlin Analyser!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Disclaimer: A quick heads-up: building this pipeline requires getting your hands dirty with Docker containers, Proxmox, and advanced Home Assistant YAML configurations. If you are comfortable with command lines and custom integrations, you&#8217;ll be right at home<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1002\" height=\"326\" src=\"https:\/\/www.creatingsmarthome.com\/wp-content\/uploads\/2026\/06\/marlin_summary_cottage_telegram.png\" alt=\"\" class=\"wp-image-5209\" srcset=\"https:\/\/www.creatingsmarthome.com\/wp-content\/uploads\/2026\/06\/marlin_summary_cottage_telegram.png 1002w, https:\/\/www.creatingsmarthome.com\/wp-content\/uploads\/2026\/06\/marlin_summary_cottage_telegram-300x98.png 300w, https:\/\/www.creatingsmarthome.com\/wp-content\/uploads\/2026\/06\/marlin_summary_cottage_telegram-768x250.png 768w\" sizes=\"auto, (max-width: 1002px) 100vw, 1002px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">How the Analyser Works<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To keep everything completely independent of cloud subscriptions, the software architecture is split into two primary components:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The<strong>&nbsp;<code><a href=\"https:\/\/github.com\/kotope\/marlin-server\">marlin-server<\/a><\/code><\/strong>:&nbsp;This is the heavy lifter. It handles the actual frame-by-frame analysis of the video files. Because it is doing the heavy visual processing, it requires a dedicated GPU &#8211; in my case RTX 3060.<\/li>\n\n\n\n<li>The<strong>&nbsp;<code><a href=\"https:\/\/github.com\/kotope\/marlin-ha-integration\" data-type=\"link\" data-id=\"https:\/\/github.com\/kotope\/marlin-ha-integration\/tree\/main\">marlin-ha-integration<\/a><\/code><\/strong>:&nbsp;This is the bridge. It coordinates the data flow between your camera system and the vision model &#8211; through Home Assistant<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">The Technical Flow: From Motion to Analysis<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To understand how these two components talk to each other, here is the exact lifecycle of a single motion event:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Analysis Request:<\/strong>&nbsp;The process begins with a Home Assistant service call (action). Instead of constantly monitoring the folder with a background watchdog, the integration fetches the motion clips from your configured media folder only when an analysis is explicitly requested by your automations.<\/li>\n\n\n\n<li><strong>Cache Check &amp; Upload:<\/strong>&nbsp;Before wasting bandwidth or GPU time, the integration first queries the&nbsp;<code>marlin-server<\/code> backend. It checks if the specific video file has already been analyzed. If the data is cached, it skips the upload entirely. If it is a new, unanalyzed clip, Home Assistant grabs the raw file and uploads it to the server over your local network.<\/li>\n\n\n\n<li><strong>GPU Processing:<\/strong>&nbsp;The&nbsp;<code>marlin-server<\/code>&nbsp;takes over. It feeds the video frames into the <strong>Marlin-2B<\/strong> model, generating that dense, structured timeline of static environment variables and micro-events.<\/li>\n\n\n\n<li><strong>Data Retrieval:<\/strong>&nbsp;The data is then returned back to Home Assistant. Depending on how you configure your automations, this can happen&nbsp;<strong>synchronously<\/strong>&nbsp;(Home Assistant pauses the automation to wait for the immediate response, perfect for instant voice assistant queries) or&nbsp;<strong>asynchronously<\/strong>&nbsp;(Home Assistant fires the clip off to the queue and retrieves the data in the background, which is ideal for the overnight batching).<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Multi-Instance Location Routing<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A key architectural feature of Marlin Analyser is its native support for multi-instance deployments. If you manage security footage across multiple properties\u2014for example, a primary residence and a remote summer cottage\u2014you don&#8217;t need separate standalone servers. Both locations can stream their clips to Home Assistant, and the integration handles location-tagged routing. You can query, automate, and trigger analysis for one specific location or aggregate the data across all properties simultaneously.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The server is powered by&nbsp;<strong>Marlin-2B<\/strong>, an incredibly efficient vision AI model <a href=\"https:\/\/huggingface.co\/NemoStation\/Marlin-2B\" target=\"_blank\" rel=\"noreferrer noopener\">available on Hugging Face<\/a> for non-commercial use. And while I built this specifically to solve my <strong>Unifi Protect headaches<\/strong>, the integration is designed to be flexible: it can use&nbsp;<em>any<\/em>&nbsp;Home Assistant media folder as its source for security footage.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">My Local Tech Stack<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you want to replicate this, you need some local processing power. Here is the exact stack I am running to make this happen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Camera Ecosystem:<\/strong>&nbsp;Unifi security systems deployed at both my primary home and summer cottage, utilizing the Unifi Protect integration to automatically store motion event clips directly into their respective local media folders.<\/li>\n\n\n\n<li><strong>The Video Analysis Environment:<\/strong>&nbsp;The&nbsp;<code>marlin-server<\/code>&nbsp;runs seamlessly inside a Docker container, hosted on a Proxmox LXC (Linux Container).<\/li>\n\n\n\n<li><strong>Video Processing Compute:<\/strong>&nbsp;I have an NVIDIA RTX 3060 with 12GB of VRAM dedicated to the&nbsp;<code>marlin-server<\/code>. This card easily chews through a 30-second 2K video clip in about 10 to 15 seconds. Note that Marlin-2B has a hard maximum capacity of processing 2-minute clips. If a motion event clip exceeds this length, the server will gracefully truncate the processing and analyze the initial two minutes only. (Thankfully, typical smart home motion clips rarely cross the 2-minute mark anyway &#8211; at least with the Unifi Protect).<\/li>\n\n\n\n<li><strong>Post-Processing Compute:<\/strong>&nbsp;To handle the complex summarization of the raw Marlin data, I pass the text output to a local LLM\u2014specifically&nbsp;<strong>Gemma4:26b<\/strong>\u2014running on an NVIDIA RTX 3090 with 24GB of VRAM.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">The Hidden Challenge: Structured Data vs. Human Readability<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Getting the video analyzed locally is only half the battle. When I first fired up the Marlin-2B model, I quickly realized a fundamental truth about raw vision AI output: it is highly clinical.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Marlin-2B does an excellent job of breaking down the scene. It accurately identifies the static environment and flags specific events as they occur. However, it delivers this as raw, structured data rather than a natural narrative. While this format is perfect for programmatic triggers, it isn&#8217;t ideal for a quick morning notification. Waking up to a clinical list of environmental variables and isolated event flags isn&#8217;t the seamless smart home experience I was aiming for.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The Post-Processing Solution<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To bridge the gap between structured data and human readability, the pipeline requires a post-processing step. The data from the&nbsp;<code>marlin-server<\/code>&nbsp;needs to be fed into a secondary Large Language Model (LLM) whose sole job is to ingest those raw events, filter out the noise, and generate a concise, actionable summary (e.g.,&nbsp;<em>&#8220;At 03:14 AM, an unknown vehicle pulled into the driveway; otherwise, the night was quiet&#8221;<\/em>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Since I already run a dedicated NVIDIA RTX 3090 (24GB VRAM) as my central home LLM to power my main Home Assistant AI integrations, it was a no-brainer to route this text payload there. I pass the raw output to&nbsp;<strong>Gemma4:26b<\/strong> running on that 3090. Because the hardware is already handling the home&#8217;s general LLM duties, it seamlessly absorbs this task, churning out natural, accurate summaries in seconds.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The Cloud Fallback<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Not everyone has a 24GB GPU in their server rack just for summarizing text. The beauty of this two-part architecture is that by the time you reach the post-processing stage, the privacy risk is already completely mitigated. The sensitive security footage never leaves your local network\u2014it is handled entirely by the RTX 3060 and Marlin-2B.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you don&#8217;t have the hardware for local text summarization, you can easily configure Home Assistant to send the raw, anonymized text payload to a fast, cheap cloud API like <em>Gemini or Claude<\/em>. You get the same intelligent morning summary without sacrificing the privacy of your actual video feeds.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step-by-Step Automation: Summaries &amp; Instant Voice Queries<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of constantly analyzing footage the second a motion event occurs, the system is designed around two highly efficient, distinct workflows: a proactive morning briefing and a reactive, instant voice query.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. The Proactive Morning Briefing<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Every morning at exactly 06:00 AM, a Home Assistant automation kicks off the primary workflow. It fires an analysis request to the&nbsp;<code>marlin-server<\/code>&nbsp;with location-specific parameters:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Primary Home:<\/strong>&nbsp;Analyzes footage strictly from the overnight window (22:00 to 06:00).<\/li>\n\n\n\n<li><strong>Summer Cottage:<\/strong>&nbsp;Runs a full 24-hour lookback to summarize the entire previous day.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Once the&nbsp;<code>marlin-server<\/code>&nbsp;finishes processing the frames and returns the structured timeline data, Home Assistant routes those payloads directly to the RTX 3090. The LLM generates two distinct, human-readable summaries (one for the house, one for the cottage) and pushes them directly to my phone as a Telegram message. By the time I wake up, I have a clean, formatted security report waiting for me.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1002\" height=\"326\" src=\"https:\/\/www.creatingsmarthome.com\/wp-content\/uploads\/2026\/06\/marlin_summary_cottage_telegram.png\" alt=\"\" class=\"wp-image-5209\" srcset=\"https:\/\/www.creatingsmarthome.com\/wp-content\/uploads\/2026\/06\/marlin_summary_cottage_telegram.png 1002w, https:\/\/www.creatingsmarthome.com\/wp-content\/uploads\/2026\/06\/marlin_summary_cottage_telegram-300x98.png 300w, https:\/\/www.creatingsmarthome.com\/wp-content\/uploads\/2026\/06\/marlin_summary_cottage_telegram-768x250.png 768w\" sizes=\"auto, (max-width: 1002px) 100vw, 1002px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">2. On-Demand Voice Assistant Queries<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Sometimes, I just want an update on the fly. Because my smart home is voice-enabled, I can simply ask the assistant:&nbsp;<em>&#8220;What has been seen at the cottage today?&#8221;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The major hurdle with voice queries is latency. You do not want to stand in your living room waiting 30 seconds or more for a GPU to chew through a new video file before the assistant can reply. To eliminate that wait time, the system relies on background caching.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Home Assistant runs a secondary background automation that batches and sends any new, unanalyzed clips to the&nbsp;<code>marlin-server<\/code>&nbsp;every two hours. Both the&nbsp;<code>marlin-ha-integration<\/code>&nbsp;and the server itself feature a built-in cache\u2014if a video file has already been processed, it is intelligently skipped.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Because the heavy visual analysis is being quietly handled in the background throughout the day, an on-demand voice query only has to pull the pre-analyzed text data, pass it through the summarization LLM, and read it back. The result is an almost instantaneous verbal update on exactly what is happening at either property.<\/p>\n\n\n\n<div class=\"wp-block-media-text is-stacked-on-mobile\" style=\"grid-template-columns:38% auto\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"956\" src=\"https:\/\/www.creatingsmarthome.com\/wp-content\/uploads\/2026\/06\/marlin_deer_in_camera-1024x956.png\" alt=\"\" class=\"wp-image-5205 size-full\" srcset=\"https:\/\/www.creatingsmarthome.com\/wp-content\/uploads\/2026\/06\/marlin_deer_in_camera-1024x956.png 1024w, https:\/\/www.creatingsmarthome.com\/wp-content\/uploads\/2026\/06\/marlin_deer_in_camera-300x280.png 300w, https:\/\/www.creatingsmarthome.com\/wp-content\/uploads\/2026\/06\/marlin_deer_in_camera-768x717.png 768w, https:\/\/www.creatingsmarthome.com\/wp-content\/uploads\/2026\/06\/marlin_deer_in_camera.png 1144w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Cottage Driveway  - It&amp;apos;s a reindeer!\" width=\"774\" height=\"435\" src=\"https:\/\/www.youtube.com\/embed\/KT8SsSit4Nw?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><figcaption class=\"wp-element-caption\">It&#8217;s not a deer.. it&#8217;s a reindeer!<\/figcaption><\/figure>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Putting It Together: Home Assistant automations<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Now let\u2019s look at how this is actually implemented in Home Assistant. The custom integration introduces three core actions:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>marlin_analyzer.get_summary<\/code>&nbsp;(performs a deep lookback and text aggregation)<\/li>\n\n\n\n<li><code>marlin_analyzer.get_instant_summary<\/code>&nbsp;(leverages cached background analysis for rapid responses)<\/li>\n\n\n\n<li><code>marlin_analyzer.analyze<\/code>&nbsp;(forces a background analysis pass to populate the cache)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">1. Automated Morning Summaries<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To automate the daily briefings, I set up two separate automations. The primary residence runs at 06:00 AM looking back at the 8-hour overnight window, while the summer cottage configuration fires at 06:30 AM to compile a full 24-hour window.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Both automations fetch the raw timeline from Marlin, pass it to a local Ollama task running Gemma, and push the final response out to Telegram.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">YAML<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>alias: Morning security summary (Home)\ndescription: &gt;-\n  Every morning at 06:00, fetch overnight video analysis from Marlin, summarize\n  it with AI, and send via Telegram.\ntriggers:\n  - trigger: time\n    at: \"06:00:00\"\nactions:\n  - action: marlin_analyzer.get_summary\n    data:\n      lookback_hours: 8\n      instance: Home\n    response_variable: marlin\n  - action: ai_task.generate_data\n    data:\n      entity_id: ai_task.ollama_ai_task\n      task_name: Security overnight summary\n      instructions: &gt;-\n        You are a home security assistant. Summarize the following overnight\n        security camera events into a brief, readable report. Focus on anything\n        noteworthy \u2014 people, vehicles, animals, unusual activity. Ignore events\n        that are clearly just wind, shadows, or lighting changes. If nothing\n        significant happened, say so briefly.\n\n        Keep the summary under 500 characters. Use English language. Start\n        directly with the summary, no greetings or headers.\n\n        Events: {{ marlin.llm_context }}\n    response_variable: ai_result\n  - action: notify.send_message\n    target:\n      entity_id: notify.home_telegram_bot\n    data:\n      message: &gt;-\n        &#x1f3ac; Night summary\n\n        {{ ai_result.data }}\n\n        &#x1f4ca; {{ marlin.clips_analyzed }} videos analysed ({{ marlin.clips_cached }} from cache)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><em>(Note: For the summer cottage automation, simply adjust the trigger to&nbsp;<code>06:30:00<\/code>, change the&nbsp;<code>lookback_hours<\/code>&nbsp;to&nbsp;<code>24<\/code>, modify the&nbsp;<code>instance<\/code>&nbsp;to&nbsp;<code>Cottage<\/code>, and swap the notification header to&nbsp;<code>&#x1f3ac; 24h summary from summer cottage<\/code>.)<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Background Caching (Every 2 Hours)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To make sure voice assistant queries are instantaneous, we can&#8217;t wait for the GPU to process video files on demand. Instead, a time-pattern automation triggers every 2 hours with a 4-hour lookback window across all instances. Because the&nbsp;<code>marlin-server<\/code>&nbsp;automatically skips files it has already processed, this keeps our local cache updated throughout the day with minimal overhead.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">YAML<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>alias: Marlin batch analysis every 2 hours\ndescription: &gt;-\n  Run video analysis on all Marlin instances every 2 hours with 4h lookback.\n  Cached items are not re-analyzed.\ntriggers:\n  - hours: \/2\n    trigger: time_pattern\nactions:\n  - action: marlin_analyzer.analyze\n    data:\n      lookback_hours: 4\nmode: single\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. The Voice Assistant Integration Script<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">With the background caching handling the heavy visual processing, we can expose a reusable script directly to Assist. By utilizing fields like&nbsp;<code>location<\/code>&nbsp;and&nbsp;<code>hours<\/code>, the voice assistant can dynamically capture the intent and fetch the cached timeline data near-instantaneously using&nbsp;<code>get_instant_summary<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">YAML<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>alias: Query security camera events\ndescription: &gt;-\n  Query analyzed security camera events for a specific location. Use this when\n  the user asks about security cameras, what happened overnight, any activity at\n  home or cottage, or anything related to security footage. Returns a summary of\n  detected events.\nicon: mdi:cctv\nmode: single\nfields:\n  location:\n    name: Location\n    description: \"Which location to query: Home, Cottage, or all for both locations.\"\n    required: true\n    example: Home\n    selector:\n      select:\n        options:\n          - Home\n          - Cottage\n          - all\n  hours:\n    name: Hours\n    description: How many hours back to look. Default 8.\n    required: false\n    default: 8\n    example: 12\n    selector:\n      number:\n        min: 1\n        max: 48\nsequence:\n  - action: marlin_analyzer.get_instant_summary\n    data:\n      instance: \"{{ location if location != 'all' else '' }}\"\n      lookback_hours: \"{{ hours | default(8) | int }}\"\n    response_variable: result\n  - stop: Security event query complete\n    response_variable: result\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Want to Build It? Installation &amp; Getting Started<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Because this project involves a couple of moving parts\u2014setting up a Dockerized server for the GPU processing and adding a custom integration to Home Assistant\u2014the full installation instructions are too extensive to paste here.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you have the hardware and want to replicate this setup, I have published everything you need on GitHub. The repositories contain the full installation guides, Docker Compose files, and the necessary custom component files for Home Assistant:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>[<a href=\"https:\/\/github.com\/kotope\/marlin-server.git\" data-type=\"link\" data-id=\"https:\/\/github.com\/kotope\/marlin-server.git\" target=\"_blank\" rel=\"noreferrer noopener\">marlin-server on GitHub<\/a>]:<\/strong>&nbsp;This repository contains the Docker environment, API structure, and instructions for getting the Marlin-2B model running with GPU passthrough.<\/li>\n\n\n\n<li><strong>[<a href=\"https:\/\/github.com\/kotope\/marlin-ha-integration.git\" target=\"_blank\" rel=\"noreferrer noopener\">marlin-ha-integration on GitHub<\/a>]:<\/strong>&nbsp;This is the custom Home Assistant integration that you can add via HACS (Home Assistant Community Store) as a custom repository. It handles the communication, caching, and blueprint actions.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The README files in both repositories will walk you through the initial configuration, how to link your Home Assistant media folders, and how to verify that your GPU is successfully chewing through the video frames. <strong>If you run into any issues or have ideas for improvements, feel free to open an issue, submit a pull request, start a discussion or just drop a comment on this article<\/strong>!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion &amp; The Road Ahead<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">So far, running this entire ecosystem has been a massive success. Moving from generic, noisy motion alerts to an intelligent, contextual summary has completely changed how I monitor my properties. The system has proven to be incredibly reliable, running quietly in the background day after day.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Is a 2-billion-parameter local vision model flawless? Of course not. Marlin-2B has its minor quirks\u2014a few times it has mistaken a backyard rabbit for a cat, and environmental edge cases will always pop up. But these small nuances never compromise the core security utility of the platform. On the flip side, its capabilities are occasionally surprising; it routinely identifies car brands accurately, and even attempts specific car models with varying degrees of success. For a lightweight model running entirely on an RTX 3060, the performance is stellar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What\u2019s Next?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Because the software is currently in such a stable and productive state, my future roadmap isn&#8217;t locked in just yet. I plan to live with the system for a while longer, monitoring how it performs across changing seasons and analyzing where the true bottlenecks or missing features might lie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Building a local-first, AI-augmented security pipeline requires some initial effort to configure hardware passthroughs and orchestrate models, but the payoff of total privacy and zero monthly fees makes it entirely worth it.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you run a local smart home, you probably share my biggest frustration with security footage: the manual review process. Waking up to a list&hellip;<\/p>\n","protected":false},"author":1,"featured_media":5224,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[100],"tags":[422,485,105,165,7,423,486,197,8],"class_list":["post-5187","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-home-assistant","tag-ai","tag-analysis","tag-automation","tag-camera","tag-home-assistant","tag-llm","tag-marlin","tag-security","tag-smart-home","has-post-thumbnail-archive"],"acf":[],"featured_image_src":"https:\/\/www.creatingsmarthome.com\/wp-content\/uploads\/2026\/06\/Gemini_Generated_Image_e0nrxhe0nrxhe0nr.png","author_info":{"display_name":"Toni","author_link":"https:\/\/www.creatingsmarthome.com\/index.php\/author\/topsy\/"},"_links":{"self":[{"href":"https:\/\/www.creatingsmarthome.com\/index.php\/wp-json\/wp\/v2\/posts\/5187","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.creatingsmarthome.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.creatingsmarthome.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.creatingsmarthome.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.creatingsmarthome.com\/index.php\/wp-json\/wp\/v2\/comments?post=5187"}],"version-history":[{"count":53,"href":"https:\/\/www.creatingsmarthome.com\/index.php\/wp-json\/wp\/v2\/posts\/5187\/revisions"}],"predecessor-version":[{"id":5245,"href":"https:\/\/www.creatingsmarthome.com\/index.php\/wp-json\/wp\/v2\/posts\/5187\/revisions\/5245"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.creatingsmarthome.com\/index.php\/wp-json\/wp\/v2\/media\/5224"}],"wp:attachment":[{"href":"https:\/\/www.creatingsmarthome.com\/index.php\/wp-json\/wp\/v2\/media?parent=5187"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.creatingsmarthome.com\/index.php\/wp-json\/wp\/v2\/categories?post=5187"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.creatingsmarthome.com\/index.php\/wp-json\/wp\/v2\/tags?post=5187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}