{"id":2005,"date":"2026-03-09T12:09:53","date_gmt":"2026-03-09T10:09:53","guid":{"rendered":"https:\/\/cln.io\/blog\/?p=2005"},"modified":"2026-03-24T11:16:24","modified_gmt":"2026-03-24T09:16:24","slug":"building-a-privacy-switch-control-indoor-cameras-using-poe-injectors-in-home-assistant","status":"publish","type":"post","link":"https:\/\/cln.io\/blog\/building-a-privacy-switch-control-indoor-cameras-using-poe-injectors-in-home-assistant\/","title":{"rendered":"Building a Privacy Switch: Control Indoor Cameras Using PoE Injectors in Home Assistant"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">I have a bunch of indoor cameras to keep an eye on my pet and monitor my home when I&#8217;m away. They work great for that. But when I&#8217;m home, I want the mental peace of knowing those cameras are <strong>physically off<\/strong> \u2014 not just toggled to some software &#8220;privacy mode&#8221; that I have to trust actually works.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">My cameras aren&#8217;t PoE-native \u2014 they&#8217;re regular USB-powered indoor cameras. But by powering them through <strong>PoE splitters<\/strong> (PoE in, USB-C\/Micro USB out) connected to a managed UniFi switch, I get a hardware kill switch: cut the PoE port, cut the camera. No firmware trust required.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Concept<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A PoE injector feeds power over the Ethernet cable. A managed PoE switch can toggle power to individual ports. If the port is off, the camera is a paperweight \u2014 no power means no CPU, no recording, no network activity. Even if your cameras have a software privacy toggle, this is the only way to <em>guarantee<\/em> they&#8217;re off.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The logic is dead simple:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>You&#8217;re home<\/strong> \u2192 PoE ports OFF \u2192 cameras have zero power<\/li>\n\n\n\n<li><strong>You leave<\/strong> \u2192 PoE ports ON \u2192 cameras boot up and record<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">What You Need<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Home Assistant<\/strong> with the <a href=\"https:\/\/www.home-assistant.io\/integrations\/unifi\/\">UniFi Network integration<\/a><\/li>\n\n\n\n<li>A <strong>managed UniFi PoE switch<\/strong> (I use the USW Flex 2.5G 8 PoE)<\/li>\n\n\n\n<li>One or more <strong>PoE-powered cameras<\/strong><\/li>\n\n\n\n<li><strong>Presence detection<\/strong> set up (phone tracker, router integration, etc.)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Setup<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. UniFi Network Integration<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Once you add the UniFi Network integration in Home Assistant, it automatically exposes switch entities for each PoE port on your managed switches. You&#8217;ll see entities like:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\">switch.usw_flex_2_5g_8_poe_port_6_poe\nswitch.usw_flex_2_5g_8_poe_port_8_poe<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Turning these switches off kills power to whatever is plugged into that port. Turning them on restores it.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. The Automation<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create an automation that reacts to presence changes and also polls every 15 minutes as a safety net. Here&#8217;s what the triggers look like in the HA automation editor:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1710\" height=\"951\" src=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/ha-poe-automation-triggers-v3.png\" alt=\"Home Assistant automation editor showing three triggers: every 15 minutes, when CLN arrives home, and when CLN leaves\" class=\"wp-image-2021\" srcset=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/ha-poe-automation-triggers-v3.png 1710w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/ha-poe-automation-triggers-v3-300x167.png 300w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/ha-poe-automation-triggers-v3-1024x569.png 1024w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/ha-poe-automation-triggers-v3-768x427.png 768w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/ha-poe-automation-triggers-v3-1536x854.png 1536w\" sizes=\"auto, (max-width: 1710px) 100vw, 1710px\" \/><figcaption class=\"wp-element-caption\">The automation triggers: a 15-minute poll plus instant presence change detection<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The action uses a Choose block with two options \u2014 one for when I&#8217;m home (turn off PoE) and one for when I&#8217;m away (turn on PoE):<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1710\" height=\"951\" src=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/ha-poe-automation-expanded-v3.png\" alt=\"Home Assistant Choose action block showing Option 1 (CLN Home - turn off PoE) and Option 2 (CLN Away - turn on PoE)\" class=\"wp-image-2022\" srcset=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/ha-poe-automation-expanded-v3.png 1710w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/ha-poe-automation-expanded-v3-300x167.png 300w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/ha-poe-automation-expanded-v3-1024x569.png 1024w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/ha-poe-automation-expanded-v3-768x427.png 768w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/ha-poe-automation-expanded-v3-1536x854.png 1536w\" sizes=\"auto, (max-width: 1710px) 100vw, 1710px\" \/><figcaption class=\"wp-element-caption\">The Choose block: home = power off, away = power on<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s the full YAML:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\">alias: \"[Camera] check every 15 min\"\ntriggers:\n  - trigger: time_pattern\n    minutes: \/15\n  - trigger: state\n    entity_id: person.your_name\n    from: not_home\n    to: home\n  - trigger: state\n    entity_id: person.your_name\n    from: home\n    to: not_home\nconditions: []\nactions:\n  - choose:\n      - conditions:\n          - condition: state\n            entity_id: person.your_name\n            state: home\n        sequence:\n          - action: switch.turn_off\n            target:\n              entity_id:\n                - switch.your_poe_port_1\n                - switch.your_poe_port_2\n      - conditions:\n          - condition: state\n            entity_id: person.your_name\n            state: not_home\n        sequence:\n          - action: switch.turn_on\n            target:\n              entity_id:\n                - switch.your_poe_port_1\n                - switch.your_poe_port_2\nmode: single<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. Why the 15-Minute Poll?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The state-change triggers handle the instant you arrive or leave. But what if Home Assistant restarts, or a trigger gets missed, or presence detection briefly flickers? The 15-minute time pattern acts as a reconciliation loop \u2014 it checks the current state and corrects the PoE ports if they&#8217;ve drifted.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Proof It Works<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s a week of history from my Home Assistant instance. The top two rows are the PoE switch ports, the bottom row is my presence. You can see the perfect correlation \u2014 every time I come home, the PoE ports switch off. Every time I leave, they switch on:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1710\" height=\"951\" src=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/ha-poe-history-v3.png\" alt=\"Home Assistant history showing PoE port states perfectly correlating with person presence over a week\" class=\"wp-image-2023\" srcset=\"https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/ha-poe-history-v3.png 1710w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/ha-poe-history-v3-300x167.png 300w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/ha-poe-history-v3-1024x569.png 1024w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/ha-poe-history-v3-768x427.png 768w, https:\/\/cln.io\/blog\/wp-content\/uploads\/2026\/03\/ha-poe-history-v3-1536x854.png 1536w\" sizes=\"auto, (max-width: 1710px) 100vw, 1710px\" \/><figcaption class=\"wp-element-caption\">A week of history: PoE ports (yellow = on, gray = off) perfectly track presence (green = home\/away)<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Why This Beats Software Privacy Mode<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Zero trust required<\/strong> \u2014 you don&#8217;t need to trust camera firmware, cloud services, or software toggles. No power = no function.<\/li>\n\n\n\n<li><strong>Auditable<\/strong> \u2014 you can check the PoE port state in Home Assistant at any time. The switch is either on or off.<\/li>\n\n\n\n<li><strong>Works with any PoE camera<\/strong> \u2014 brand doesn&#8217;t matter. If it&#8217;s powered by PoE, this works.<\/li>\n\n\n\n<li><strong>Simple to debug<\/strong> \u2014 if the camera is on when it shouldn&#8217;t be, check one automation and two switch entities.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Trade-offs<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Boot time<\/strong> \u2014 PoE cameras take 30-60 seconds to boot when power is restored. There&#8217;s a brief window after you leave where the cameras aren&#8217;t recording yet.<\/li>\n\n\n\n<li><strong>Wear<\/strong> \u2014 frequent power cycling is harder on hardware than leaving it running 24\/7, though modern PoE cameras handle this fine.<\/li>\n\n\n\n<li><strong>Recording gap<\/strong> \u2014 if someone arrives right as you leave, there&#8217;s a short gap before recording starts. For most home use, this is an acceptable trade-off for guaranteed privacy when you&#8217;re home.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The best privacy mode is no power. By using Home Assistant&#8217;s UniFi integration to control PoE switch ports based on presence, you get hardware-enforced camera privacy with zero reliance on software promises. It&#8217;s simple, auditable, and works with any PoE camera \u2014 no special firmware or cloud integration needed.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-text-color has-link-color wp-elements-967424fa0fe7e660ff6075a5cd01473a wp-block-paragraph\" style=\"color:#9ca3af;font-size:14px\">This post was written with the help of Claude (Opus 4), Anthropic&#8217;s AI assistant.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I have a bunch of indoor cameras to keep an eye on my pet and monitor my home when I&#8217;m away. They work great for that. But when I&#8217;m home, I want the mental peace [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2030,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,64,4,26,37,27],"tags":[],"class_list":["post-2005","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-automation","category-cameras","category-homeassistant","category-it","category-networking","category-privacy"],"_links":{"self":[{"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/posts\/2005","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/comments?post=2005"}],"version-history":[{"count":7,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/posts\/2005\/revisions"}],"predecessor-version":[{"id":2026,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/posts\/2005\/revisions\/2026"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/media\/2030"}],"wp:attachment":[{"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/media?parent=2005"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/categories?post=2005"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cln.io\/blog\/wp-json\/wp\/v2\/tags?post=2005"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}