Doorbell Popup
doorbell-popup opens a Home Assistant more-info camera popup as an Omarchy webapp and positions it as a floating Hyprland window. It can run once, or watch a Home Assistant entity and open the popup when that entity turns on.
Host bindings
Section titled “Host bindings”Both public host overrides expose a permanent open-only popup on:
SUPER+ALT+CBoth hosts use the same mobile-sized bottom-right geometry on the active workspace’s monitor. Nothing is forced to a host-specific monitor or workspace.
Defaults
Section titled “Defaults”The script defaults to:
| Setting | Default |
|---|---|
| Motion entity | input_boolean.doorbell |
| Camera entity | camera.front_door_snapshot |
| Home Assistant URL | http://homeassistant.local:8123 |
| Target workspace | Active workspace |
| Size | 380x500 |
| Duration | 20 seconds |
The popup URL is built as:
<base-url>/lovelace/home?more-info-entity-id=<camera-entity>Open once
Section titled “Open once”Open the popup and exit:
doorbell-popup --open-onlyKeep it open instead of scheduling the auto-close timer:
doorbell-popup --open-only --no-auto-closeFocus the popup after opening or repositioning:
doorbell-popup --open-only --focus-popupWatch mode
Section titled “Watch mode”Run without --open-only to watch the motion entity:
doorbell-popupWatch mode uses:
go-automate ha bridge watch entity --bar-json --icon '' input_boolean.doorbellWhen the emitted JSON has class on, the popup opens or repositions.
The Omarchy Shell Home Assistant service keeps this watcher loaded in the background through ha-module-bar doorbell; it does not add a visible dashboard row.
Positioning
Section titled “Positioning”doorbell-popup uses the focused monitor by default, keeping the popup on the active workspace. Explicit flags override that:
--monitor <name>targets that monitor.--workspace <id>moves the popup to that workspace and uses its monitor.
doorbell-popup delegates geometry to launch-floating-webapp, the same global command used by shell webapp clicks. It places the exact launched window in the target monitor’s bottom-right corner and accounts for output scale and reserved areas.
Useful overrides
Section titled “Useful overrides”doorbell-popup --open-only --monitor DP-1 --width 380 --height 500doorbell-popup --entity input_boolean.doorbell --camera-entity camera.front_door_snapshotdoorbell-popup --base-url http://homeassistant.local:8123 --workspace 1doorbell-popup --duration 30 --margin 20 --bottom-margin 12Numeric values must be positive integers.
Test without a real event
Section titled “Test without a real event”Simulate one on event:
doorbell-popup --simulate-event on --simulate-exitForce the startup simulation path:
doorbell-popup --force-motion-true --simulate-exitThe script stores the last popup address at:
${XDG_RUNTIME_DIR:-/tmp}/doorbell-popup.addressIf that address still exists, the script repositions the existing popup instead of opening a duplicate. If the address is stale, it removes the file.
Recovery flow
Section titled “Recovery flow”- Test with
doorbell-popup --open-onlyfirst. - Add
--monitor,--width, and--heightuntil placement is right. - Test the event path with
--simulate-event on --simulate-exit. - Run watch mode only after the open-once path works.
Troubleshooting
Section titled “Troubleshooting”If the script exits immediately, check required commands:
command -v go-automate hyprctl jq launch-floating-webappIf placement is on the wrong monitor, pass --monitor <name> and verify monitor names with:
hyprctl -j monitorsIf no event opens the popup, check the entity stream directly:
go-automate ha bridge watch entity --bar-json --icon '' input_boolean.doorbellIf the popup keeps reusing a dead address, remove the runtime file:
rm -f "${XDG_RUNTIME_DIR:-/tmp}/doorbell-popup.address"