Monitors & Zones
Listing monitors
for m in zm.monitors():
print(f"Monitor {m.id}: {m.name} ({m.function}) {m.width}x{m.height}")
# Single monitor
m = zm.monitor(1)
monitors() returns list[Monitor]. Results are cached after the first
call; pass force_reload=True to refresh.
Monitor status
Each monitor carries a status object with runtime information:
m = zm.monitor(1)
print(m.status.state) # "Idle", "Alarm", etc.
print(m.status.fps) # capture FPS (float)
print(m.status.analysis_fps) # analysis FPS (float)
print(m.status.bandwidth) # capture bandwidth in bytes (int)
print(m.status.capturing) # "None", "Capturing", etc.
Monitor control
m = zm.monitor(1)
# Alarm control
m.arm() # trigger alarm
m.disarm() # cancel alarm
status = m.alarm_status() # check alarm state
# Update monitor settings
m.update(Function="Modect", Enabled="1")
# Daemon status
m.daemon_status() # capture daemon (zmc) status
Streaming & snapshot URLs
m = zm.monitor(1)
# MJPEG stream
url = m.streaming_url() # protocol=mjpeg (default)
url = m.streaming_url(maxfps=5, scale=50) # with extra params
# Single-frame snapshot
url = m.snapshot_url() # mode=single
url = m.snapshot_url(scale=50)
Both URLs are built from the portal URL and ZM_PATH_ZMS config, with
automatic path deduplication (e.g. /zm won’t be doubled).
PTZ control
m = zm.monitor("FrontDoor (Video)")
if m.controllable:
# Query what the camera can do
caps = m.ptz_capabilities()
print(caps.can_move_con, caps.can_zoom, caps.has_presets)
# Simple commands — auto-detects the best mode from the control profile
m.ptz("up")
m.ptz("stop")
m.ptz("zoom_in")
# Move for 2 seconds then auto-stop
m.ptz("right", stop_after=2.0)
# Explicit mode override
m.ptz("left", mode="rel")
# Presets
m.ptz("home")
m.ptz("preset", preset=3)
Supported commands: up, down, left, right, up_left,
up_right, down_left, down_right, zoom_in, zoom_out,
stop, home, preset.
Modes: auto (default — picks the best mode supported by the camera’s
control profile, preferring continuous > relative > absolute),
con (continuous), rel (relative), abs (absolute).
Monitor events
m = zm.monitor(1)
# Query events for this monitor
recent = m.events(since="6 hours ago", limit=10)
for ev in recent:
print(f"Event {ev.id}: {ev.cause} ({ev.length:.1f}s)")
# Bulk-delete old events for this monitor
count = m.delete_events(before="1 week ago", limit=500)
print(f"Deleted {count} events from {m.name}")
Accepts the same filters as the top-level zm.events() and
zm.delete_events() calls — see Events & Frames for the full list.
Getting zones
m = zm.monitor(1)
zones = m.get_zones()
for z in zones:
print(f"{z.name}: {len(z.points)} points, pattern={z.pattern}")
Zones are used by the ML detector for region-based filtering.