* Simulator improvements: profile-load lifecycle, cache hygiene, naming
Profile load lifecycle:
- Drop _add_zm_server from the ZM seed builders. The ZmServer was
being persisted by both the seed and the simulator's on-demand
auto-create, doubling up under a hydration race.
- Add ServiceSimulator.post_load_hook() — a deterministic
lifecycle point invoked once per profile load after hydration.
ZoneMinderSimulator overrides it to materialize the singleton
ZM Server so freshly-created and freshly-switched profiles
always show it.
- Take the manager's data lock for the duration of
_load_entities_for_simulator's clear+rehydrate, closing the
race where a concurrent add_sim_entity could see an empty map
mid-hydration and persist a duplicate singleton. The
initialize() flow releases the lock before the cross-thread
sync_to_async hop so the existing once-only _initialized guard
still works without deadlocking.
Cache hygiene:
- Add NoStoreMiddleware (in both hi.middleware and
hi.simulator.middleware so the apps stay independent) that sets
Cache-Control: no-store on HTML and JSON responses lacking an
explicit directive. Without this, browsers apply heuristic
caching and may serve a stale page when the server is down —
making controls appear functional while every AJAX call
silently fails. Static assets and views with explicit
Cache-Control are not touched.
Naming:
- ZM 'volume' profile cameras renamed 'Volume Camera NN' →
'ZM Camera NN'.
- Frigate 'volume' profile cameras renamed 'Volume Camera NN' →
'Frigate Camera NN', with the wire-format camera_name tracking
the rename so diagnostics stay coherent.
* HA camera snapshot regression: strip substate suffix in state-id map
Cameras stopped showing the polled snapshot in the live view after
the motion_detection substate was added: cameras went through the
multi-substate decomposition path and their Sensor rows now carry
'~state' / '~motion_detection' integration_names instead of the
bare 'camera.X'. The HassManager's entity_id->ha_state_id map was
returning those suffixed names, but the latest-attrs cache is keyed
by the bare HA state id, so the lookup missed and
get_entity_video_snapshot returned None — the template fell through
to the placeholder branch.
Strip the suffix when building the map so the lookup hits. Multiple
substate sensors for the same camera collapse to the same bare key
by construction.
Also added a code comment at the device-grouping short-name match
documenting that pairing only spans the current sync pass: an
operator who excludes 'camera' on one sync and re-enables it on a
later sync gets a standalone motion-sensor orphan that the
newly-arriving camera does not absorb. Rare power-user scenario;
documented for the next reader rather than fixed with cross-pass
absorption logic.
* Fix two attribute restore regressions
Restore-default icon (single attribute):
_restoreTextarea updated the textarea and hidden field but left
the read-mode div untouched. With the read-mode linkified rendering
introduced more recently, the operator sees no visible change after
Restore — the form's dirty state ticks over but the displayed value
doesn't until they hit Save. _restoreTextarea now also overwrites
the read-mode content div with the restored value as escaped plain
text. Server-side linkification returns on the next save.
Restore-from-history (config settings, multi-attribute page):
SubsystemAttributeRestoreInlineView routes through
<int:subsystem_id> while the initial ConfigSettingsView routes
through a re_path \d+ capture (string). The template's tab-pane
'show active' comparison
selected_subsystem_id == owner.id|stringformat:'s'
succeeded for the initial render (string==string) and silently
failed for the restore response (int==string is False in Django
templates). The response replaced #attr-v2-content-subsystem
correctly, but every tab-pane rendered without 'show active', so
Bootstrap's .fade hid all of them. The action bar above the tabs
stayed visible, looking exactly like 'only the UPDATE button
re-rendered'. Normalize selected_subsystem_id to str in
SubsystemAttributePageEditContext so callers can pass int or str
and the comparison always succeeds.
* Weather monitor: opt out of alarms, link banner to health modal
The weather monitor's health status is now surfaced in the sidebar
notice area, so it no longer needs to participate in the alarm/alert
subsystem to be visible. Drop the alarm_ceiling override (which had
opted WeatherMonitor in at AlarmLevel.INFO), the now-unused AlertMixin
parent, and the corresponding imports. Inherited default behavior
returns the monitor to 'publish health only, dispatch no alarms'.
When the conditions-pane status banner shows (warning/error states),
clicking it now opens the existing system_health_status modal for the
weather monitor. The banner is an <a> with data-async='modal'; the
HTML5 parser auto-closes the surrounding clickable-card <a> when it
encounters the inner one, so the banner ends up as a DOM sibling and
its click doesn't trigger the conditions-details modal. Antinode's
delegated handler already calls preventDefault + stopPropagation, so
no extra propagation control is needed.
* Rename user-facing 'Trigger' vocabulary to 'Rule' / 'Rule Matches'
The internal Event / EventDefinition models had been surfaced to
operators as 'Trigger' / 'Trigger Rule' / 'Trigger History'. 'Trigger'
collides with the term several integrations use (HA triggers,
ZoneMinder events, Frigate events) and read poorly enough to want to
change. Internal class names stay; only user-visible strings move:
EventDefinition -> 'Rule'
EventClause -> 'Rule Condition'
EventHistory -> 'Rule Match' / 'Rule Matches'
Trigger Type -> 'Match Type' (operator label)
Trigger Window Secs -> 'Match Window Secs' (operator label)
Trigger when ... -> 'Match when ...' (operator help)
Config tab 'Triggers' -> 'Rules'
Sidebar 'TRIGGER HISTORY' -> 'RULE MATCHES'
Migration 0009 reflects the verbose_name / verbose_name_plural
changes. Domain phrases like 'sensor triggers' and 'alarms trigger'
(unrelated to EventDefinition) are kept; same with internal code
identifiers, comments, and trigger_reason fields.
* Frigate: expose Authorization Header field and document static-auth scenarios
Flip AUTH_HEADER.is_editable to True so operators can set the
Authorization header value themselves. The client already sends the
value verbatim, so no client changes needed.
Document the supported static-auth scenarios in
docs/integrations/frigate.md with a table: no-auth (default), reverse
proxy with HTTP Basic, reverse proxy with long-lived bearer, reverse
proxy with anonymous backend, and Frigate's built-in JWT login
(not supported in v1). The header field is the right answer for the
first three; the last has a documented workaround (front Frigate with
a proxy that handles auth).
7.7 KiB
Getting Started
Once successfully running (see the Installation Page), you will be greeted with:
Choose which home type you want to use. If you choose "Two Story", you will see this initial screen with some common household items pre-populated.
These provide defaults to get started quickly. You can modify and customize as much as you want after this.
Adding Information
To core feature of Home Information is managing information about your home and the things in it. To add information, tap on any of the items and you will see the main information view/edit dialog. Initially, it looks like this:
Use the "Add Info" button to add some information about the item. Or use the "Add File" button to upload a document:
Some information may not be associated with an individual item, but the home overall. For that, use the top-right button to add the information to the home itself.
Multiple Spaces
If you have a multi-story house, basement, attic or even another vacation home or second property, you can create a different "space" for that. Here we have an extra space defined for the second floor rooms and crawl spaces.
Collections
Not everything in your home has a well defined location, so use the "collections" bottom buttons for those items and you can choose whether you prefer a list of grid layout.
Weather
There are some default weather integrations which also provide weather alerts. Tap on the weather information to see more details.
Seen sunrise times, sunset, moon phase, weather history and more.
Controls and Settings
Control alert sounds, screen brightness and lock your screen. The alerts and display keep running so you do not miss anything.
For accurate weather and time, be sure to set your timezone and geographic location in the configuration pages.
Layout Editing
You have full control of the layout of your items and the background image. These are all managed by choosing "EDIT" and entering "Editing Mode".
The Editing Page has many details on how to use the editor.
Integrations
For smart home device automation, go to the configuration area to enable one of the current integrations (e.g., Home Assistant).
After enabled, you can import all the items to add them to your views and collections.
See the Integrations Page for more details.
Cameras
If the integation provides cameras with video feeds (e.g., ZoneMinder), the cameras will appear in the side bar for easy access to their streams and for browsing the video stream history from past motion events.
Alert Rules and Security Modes
By default, if you have motion sensors, open/close sensors, camera motion, etc. the integration item import automatically creates alert rules. You can view, refine and manage these in the configuration pages.
The rules allow you to target different "security modes" for better control of what alerts and when.
Alert Areas
In the editor, you can define areas and associate it with a device, like a camera. Then, if the camera detects motion, both the camera and the area will be highlighted.
The highlighting will change color over time so you can see what is currently alarming, recently alarmed or what was active in the near past.
Additional Details
Custom Background Images
In the editor, you can swap out the default property/house images for your own custom images. See the Custom Background Image Page for more details.
Alert Sounds
For features that use sounds (e.g., alerts), this allows toggling to mute and unmute. The alert sounds are considered "auto-play" by browsers, so you may need to allow this in the browser in order to hear the alert sounds. If you see "blocked' on this button, click it to see more info about fixing it.
Locking Feature
When visitors are in your house, be they friends, acquaintances, service or maintenance people, you may want to temporarily lock the screen so they cannot access the information you've stored. To unlock, it uses a password you set the first time you lock the screen. This is is just a light security convenience against casual snooping. Locking the device itself is better protection.



















