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+CThe desktop host opens on monitor DP-1 with the default camera and a larger popup. The laptop host opens on monitor eDP-1, sets camera.front_door_snapshot, and uses a smaller popup size.
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 | 1 |
| Size | 640x640 |
| 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.
Positioning
Section titled “Positioning”doorbell-popup chooses a monitor in this order:
- The explicit
--monitor <name>if present and found. - The monitor that owns the target workspace.
- The currently focused monitor.
Hyprland reports monitor geometry in raw pixels while movewindowpixel and resizewindowpixel use logical coordinates, so the script divides by monitor scale before positioning. It also accounts for reserved monitor areas.
Useful overrides
Section titled “Useful overrides”doorbell-popup --open-only --monitor DP-1 --width 640 --height 640doorbell-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 omarchy-launch-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"