Event Engine User Manual
Comprehensive reference for all triggers, conditions, actions, and settings.
Overview
Event Engine is an IFTTT-style automation engine that runs directly on your Axis camera as an ACAP application. It replaces and extends the built-in Axis event system with a flexible rule engine that reacts to camera events, schedules, MQTT messages, and webhooks, then responds with notifications, camera commands, logic operations, and more.
Each Rule is composed of three parts:
- Triggers — what starts the rule (one or more, evaluated as OR or AND)
- Conditions — optional checks that must pass before actions run
- Actions — what happens when the rule fires (run in sequence)
Rules take effect immediately when saved — no restart required.
Installation
- Download the latest
.eapfile from Releases. Choose the file that matches your camera architecture:- aarch64 — newer Axis cameras (ARTPEC-8, most cameras from 2020+)
- armv7hf — older Axis cameras (ARTPEC-6/7)
- In your camera's web interface, go to Apps.
- Click Add app and upload the
.eapfile. - Once installed, start the app.
Accessing the UI
Open a browser and navigate to:
http://<camera-ip>/local/acap_event_engine/index.html
You will be prompted for camera credentials (admin-level account required). The UI has five sections accessible via the top tab bar:
- Rules — create, manage, and monitor your automation rules
- Event Log — per-rule firing history
- Variables — named variables and counters
- Settings — MQTT broker, SMTP, location, proxy, and backup
- API Docs — interactive OpenAPI documentation
How Rules Work
A rule fires when any of its triggers activate (OR logic by default, switchable to AND). Before actions run, conditions are checked — by default all must evaluate to true (AND logic), but condition logic can be switched to OR so that any passing condition allows execution. Actions then execute in sequence from top to bottom.
Creating a Rule
- Click + New Rule on the Rules tab (or choose a starter from Templates).
- Enter a descriptive rule name.
- Click + Add Trigger and choose a trigger type from the dropdown.
- Optionally click + Add Condition to add guards that must pass.
- Click + Add Action and configure what should happen.
- Click Save Rule. The rule is active immediately.
{{variable}} placeholders. Available variables change based on the trigger type selected.Rule Settings
| Setting | Description |
|---|---|
| Enabled | Toggle to enable or disable a rule without deleting it. |
| Trigger logic | OR (default) — fires when any trigger activates. AND — fires only when all triggers have activated. In AND mode, an optional correlation window (seconds) requires all triggers to activate within that time frame; set to 0 for no time limit. |
| Condition logic | AND (default) — all conditions must pass. OR — any single passing condition allows execution. |
| Cooldown | Minimum seconds between firings. Prevents alert floods when a trigger fires repeatedly. |
| Max Executions | Limit how many times the rule can fire within a period: per minute, per hour, per day, or lifetime total. The period counter auto-resets; the lifetime counter resets when the rule is saved. |
Managing Rules
Each rule card shows the rule name, trigger and action badges, and a last-fired timestamp. Actions available from the rule card:
- Edit — open the rule in the editor
- Duplicate — clone the rule as a starting point
- Enable / Disable — toggle without deleting
- Fire Now — manually trigger the rule once for testing
- Delete — permanently remove the rule
Use the search bar at the top of the Rules tab to filter rules by name. Use Export / Import to download or upload rules as JSON. Individual rules can also be exported from their action menu.
Triggers
A trigger defines what event starts a rule. You can add multiple triggers to a single rule; all triggers of the same type stack as OR conditions by default.
Device Event
Fires when any device event occurs — motion detection, thermometry, tampering, I/O state changes, analytics, air quality, and more. Events are loaded live from the device and presented in a searchable dropdown.
Options
| Option | Description |
|---|---|
| Event | Select from the live event catalog. Use the search box to filter by name or topic. |
| Value condition | Optionally filter on an event data field: boolean match (true/false), string value (substring contains), or numeric threshold (is above, is below, equals, is between). |
| Hold duration | Require the value condition to persist for N seconds before the rule fires. The timer resets if the condition breaks before N seconds elapse. |
{{trigger.*}} variables for downstream actions.Schedule
Fires on a time-based schedule. Four schedule modes are available:
| Mode | Description |
|---|---|
| Cron | Standard 5-field cron expression (minute hour day month weekday). Use * for "every". Example: 0 8 * * 1-5 = every weekday at 08:00. |
| Interval | Fire repeatedly every N seconds. Minimum: 10 seconds. |
| Daily time | Fire at a specific time of day. Select the days of the week to apply. |
| Sunrise / Sunset | Fire at astronomical events: sunrise, sunset, solar noon, civil dawn, or civil dusk. Optional offset in minutes (positive = after, negative = before). Uses latitude/longitude from the Location settings (or a per-trigger override). |
MQTT Message
Fires when an incoming MQTT message arrives on a matching topic. Requires the MQTT broker to be configured in Settings.
| Option | Description |
|---|---|
| Topic | MQTT topic to subscribe to. Wildcards + (single level) and # (multi-level) are supported. |
| Payload filter | Optional. Only fire if the payload contains this string. |
Available variables injected by this trigger: {{trigger.topic}}, {{trigger.payload}}.
HTTP Webhook
Fires when an external system sends an HTTP POST request to the camera with a matching token. Each webhook trigger has its own unique secret token (up to 120 characters).
POST http://<camera-ip>/local/acap_event_engine/fire
Content-Type: application/json
{
"token": "my-secret-token",
"payload": { "source": "doorbell", "floor": 2 }
}
Values from payload are injected as {{trigger.KEY}} variables (e.g. {{trigger.source}}, {{trigger.floor}}).
I/O Input
Fires on a digital input port state change.
| Option | Description |
|---|---|
| Port | The I/O port number to monitor. |
| Edge | Rising (low→high), Falling (high→low), or Both. |
| Hold duration | Require the state to persist for N seconds before firing. |
Counter Threshold
Fires when a named counter value crosses a configured threshold. Useful for "fire after 10 motion events" type logic in combination with the Increment Counter action.
| Option | Description |
|---|---|
| Counter name | The name of the counter to watch. |
| Operator | Comparison: >, >=, <, <=, or =. |
| Value | The numeric threshold value. |
Rule Chain
Fires when another named rule executes. Use this to build multi-step workflows where one rule triggers another.
| Option | Description |
|---|---|
| Rule name | The name of the rule whose execution triggers this one. |
AOA Scenario
Fires when an Axis Object Analytics scenario generates an event. Requires the AOA application to be installed and configured on the camera.
| Option | Description |
|---|---|
| Scenario | Select from the list of configured AOA scenarios. |
| Object class filter | Optionally limit to a specific class: Human, Car, Truck, Bus, Bike, Other Vehicle, or Any. |
Variables injected: {{trigger.scenario_id}}, {{trigger.object_class}}.
Conditions
Conditions act as guards. By default (AND logic), all conditions must evaluate to true before actions run. With OR logic (configurable in Rule Settings), any single passing condition is sufficient. If no conditions pass, the rule silently does nothing for that firing.
Time Window
Only allow the rule to fire between two times of day.
| Option | Description |
|---|---|
| Start time | The earliest time (HH:MM) in the allowed window. |
| End time | The latest time (HH:MM) in the allowed window. If end < start, the window wraps midnight. |
| Days | Optional. Select which days of the week the window applies. If left empty, applies every day. |
I/O State
Check the current state of a digital I/O port before proceeding.
| Option | Description |
|---|---|
| Port | The I/O port number to check. |
| Expected state | High or Low. |
Counter Compare
Compare a named counter value against a threshold.
| Option | Description |
|---|---|
| Counter name | Name of the counter to read. |
| Operator | >, >=, <, <=, or = |
| Threshold | Numeric value to compare against. |
Variable Compare
Compare a named variable against a string value.
| Option | Description |
|---|---|
| Variable name | Name of the variable to check. Use system.armed for the arm/disarm pattern (see Arm / Disarm). |
| Operator | equals or not equals. |
| Value | String to compare against. |
HTTP Check
Make an HTTP request and pass the condition only if the response matches expectations.
| Option | Description |
|---|---|
| URL | The endpoint to check. Supports {{variable}} substitution. |
| Expected HTTP Status | The status code the response must return (e.g. 200). |
| Expected Body Contains | Optional substring that must appear in the response body. |
| JSON Path | Optional dot-notation path into a JSON response to extract a value (e.g. data.temperature). |
| JSON Expected Value | The value the extracted JSON field must equal for the condition to pass. |
| Allow insecure | Skip TLS certificate verification for self-signed certificates. |
AOA Occupancy
Poll Axis Object Analytics occupancy for a scenario and pass only if the count satisfies a configured threshold.
| Option | Description |
|---|---|
| Scenario | The AOA scenario to poll. |
| Object class | Which class to count: Human, Car, Truck, Bus, Bike, Other Vehicle, or All (total). |
| Operator | >, >=, <, <=, or = |
| Count | Numeric occupancy threshold. |
Day / Night
Pass only during daytime (after sunrise) or nighttime (after sunset). Uses the sunrise/sunset engine with the latitude/longitude configured in Location settings.
| Option | Description |
|---|---|
| Period | Day or Night. |
| Lat/Lon override | Optional per-condition coordinates, overriding the global Location setting. |
The rule editor shows today's computed sunrise and sunset times for the configured location.
Device Event State
Check the current state of any device event by polling the device’s event instances.
| Option | Description |
|---|---|
| Topic substring | Filter event instances whose topic contains this string. |
| Data key | The event data key to inspect (e.g. active). |
| Expected value | The value the data key must equal (e.g. true). |
Actions
Actions run in sequence from top to bottom when a rule fires and all conditions pass. You can drag action rows to reorder them. All text fields support {{variable}} substitution — see Dynamic Variables.
HTTP Request
Send an HTTP request to any URL.
| Option | Description |
|---|---|
| Method | GET, POST, PUT, or DELETE. |
| URL | Target URL. Supports {{variable}} substitution. |
| Username / Password | Optional HTTP Basic Auth credentials. |
| Headers | Optional key/value pairs (e.g. Authorization: Bearer token). |
| Body | Request body (POST/PUT). Template substitution supported. |
| Attach snapshot | Fetch a JPEG from the camera and make it available as {{trigger.snapshot_base64}} in subsequent actions and in this action's body. |
| Allow insecure | Skip TLS certificate verification for self-signed certificates. |
| Fallback action | Execute an alternate action when the request fails (non-2xx or network error): log a syslog message, publish to MQTT, or send a secondary HTTP GET request. |
MQTT Publish
Publish a message to an MQTT topic. Requires the MQTT broker to be configured in Settings.
| Option | Description |
|---|---|
| Topic | MQTT topic to publish to. Template substitution supported. |
| Payload | Message payload. Template substitution supported. |
| QoS | Quality of service: 0 (at most once) or 1 (at least once). |
| Retain | Set the MQTT retain flag so the broker keeps the last message for new subscribers. |
Slack
Send a message to a Slack channel via an incoming webhook.
| Option | Description |
|---|---|
| Webhook URL | The Slack incoming webhook URL. |
| Message | Message text. Template substitution supported. Slack markdown is allowed. |
| Channel override | Optional. Override the default channel configured in the webhook. |
| Username override | Optional. Override the display name. |
| Attach snapshot | Capture and include a camera snapshot in the Slack message. |
Teams
Send an Adaptive Card to Microsoft Teams via a Power Automate / Workflows webhook.
| Option | Description |
|---|---|
| Webhook URL | The Teams channel incoming webhook URL. |
| Title | Optional card title. Template substitution supported. |
| Message | Card body text. Template substitution supported. |
| Theme colour | Optional hex colour for the card accent bar (e.g. #FF0000). |
| Attach snapshot | Capture and include a camera snapshot in the Teams card. |
Telegram
Send a message via the Telegram Bot API.
| Option | Description |
|---|---|
| Bot token | Your Telegram bot's API token (from @BotFather). |
| Chat ID | The target chat, group, or channel ID. |
| Message | Message text. Template substitution supported. Use MarkdownV2 or HTML parse mode. |
| Parse mode | Markdown, HTML, or plain text. |
| Disable link preview | Suppress Telegram's URL preview cards. |
| Attach snapshot | Capture a camera snapshot and send it as a photo in the Telegram message. |
Email (SMTP)
Send an email. The SMTP server, credentials, and from address are configured once in Settings → Email (SMTP); each action only needs the recipient, subject, and body.
| Option | Description |
|---|---|
| To | Recipient email address (comma-separated for multiple recipients). |
| Subject | Email subject. Template substitution supported. |
| Body | Email body. Template substitution supported. |
| Attach snapshot | Capture and attach a camera snapshot JPEG to the email. |
Snapshot Upload
Capture a JPEG from the camera and upload it to a URL.
| Option | Description |
|---|---|
| URL | Target URL. Template substitution supported. |
| Method | POST or PUT. |
| Channel | Video channel to capture from. |
| Username / Password | Optional Basic Auth credentials for the target server. |
| Extra headers | Optional custom HTTP headers for the upload request. |
FTP Upload
Capture a JPEG and upload it to an FTP or SFTP server.
| Option | Description |
|---|---|
| URL | Full FTP URL including path. Template-aware (e.g. ftp://server/{{camera.serial}}/{{date}}_{{time}}.jpg). Directories are created automatically. |
| Username / Password | FTP credentials. |
Send Syslog
Write a message to the camera's system log (visible in the camera's system log view).
| Option | Description |
|---|---|
| Message | Syslog message text. Template substitution supported. |
| Level | Log severity: info, warning, or error. |
Recording
Start or stop a recording on the camera.
| Option | Description |
|---|---|
| Operation | Start or Stop. |
| Stream profile | Recording profile to use (configured in the camera's recording settings). |
| Max duration | Maximum recording length in seconds. Recording stops automatically after this limit. |
| While active | Automatically stop the recording when the triggering condition clears. See While-Active Actions. |
Overlay Text
Write text on the live video stream.
| Option | Description |
|---|---|
| Channel | Video channel number. |
| Text | Overlay text. Template substitution supported. |
| Position | Where to place the text: top-left, top-right, bottom-left, bottom-right, top, or bottom. |
| Text colour | Overlay colour: white, black, red, transparent, or semi-transparent. |
| Duration | Seconds before the overlay is cleared automatically. Set to 0 and enable While active to clear when the triggering condition ends. |
| While active | Automatically clear the overlay when the triggering condition clears. See While-Active Actions. |
PTZ Preset
Move the camera to a named preset position. Available presets are loaded from the camera.
| Option | Description |
|---|---|
| Channel | PTZ channel number. |
| Preset | Preset name (selected from a dropdown populated by the camera). |
Guard Tour
Start or stop a configured PTZ guard tour. Available tours are loaded from the camera and shown in a dropdown.
| Option | Description |
|---|---|
| Operation | Start or Stop. |
| Tour | Guard tour to control (selected from a dropdown). |
IR Cut Filter
Force the IR cut filter state.
| Option | Description |
|---|---|
| Mode | Day (IR cut on), Night (IR cut off), or Auto (restore automatic switching). |
| Channel | Video channel to apply the filter change to. |
Privacy Mask
Enable or disable a named privacy mask.
| Option | Description |
|---|---|
| Mask name | Name of the privacy mask to control (loaded from the camera). |
| Action | Enable or Disable. |
| Channel | Video channel to apply the mask change to. |
Wiper
Trigger the windshield wiper on cameras that support it (e.g. outdoor housings).
| Option | Description |
|---|---|
| Operation | Start or Stop. |
| Device ID | Which wiper device to control (for multi-sensor cameras). |
| Duration | Optional. Seconds to run the wiper (for cameras with variable-duration wipers). |
Light Control
Control an Axis illuminator (white light or IR LED).
| Option | Description |
|---|---|
| Operation | On, Off, or Auto (restore automatic control). |
| Light ID | Which illuminator to control (loaded from the camera). |
| Intensity | Optional brightness percentage (0–100) when turning on. |
Audio Clip
Play a named media clip on the camera. Available clips are loaded from the camera.
| Option | Description |
|---|---|
| Clip | Select from audio clips installed on the camera. |
Siren / Light
Start or stop a named siren/LED profile on devices that support it (e.g. Axis D6310).
| Option | Description |
|---|---|
| Operation | Start or Stop. |
| Profile | Siren/light profile name (from a dropdown populated by the camera). |
| While active | Automatically stop the siren/light when the triggering condition clears. See While-Active Actions. |
I/O Output
Set a digital output port high or low.
| Option | Description |
|---|---|
| Port | Output port number. |
| State | High or Low. |
| Duration | Optional. Automatically reset to the opposite state after N seconds. |
| While active | Automatically reset the output when the triggering condition clears. See While-Active Actions. |
Notification Digest
Buffer events and send a batched summary on a configurable interval. Useful for sending hourly summaries instead of individual alerts.
| Option | Description |
|---|---|
| Buffer name | Unique identifier for this digest queue. Multiple rules can contribute to the same digest. |
| Flush interval | Seconds between sends. Minimum: 30 seconds. |
| Entry template | Template for each buffered event line. Template substitution supported. |
| Delivery | Where to send the batched summary: Slack, Teams, Telegram, Email, or MQTT. |
Delay
Pause the action sequence for N seconds before continuing to the next action. Use this to create timed sequences within a rule.
Set Variable
Create or update a named persistent variable stored on the camera. Variables survive restarts.
| Option | Description |
|---|---|
| Variable name | Name of the variable to set. Use any alphanumeric name. Use system.armed for arm/disarm. |
| Value | New value. Template substitution supported. |
Increment Counter
Modify a named persistent counter.
| Option | Description |
|---|---|
| Counter name | Name of the counter to modify. Auto-created on first use. |
| Operation | Increment (add), Decrement (subtract), Reset (zero the counter), or Set (assign an exact value). |
| Delta / Value | Amount to add/subtract (for increment/decrement), or the exact value (for set). Default: 1. |
Run Rule
Immediately trigger another named rule. Useful for shared action sequences or conditional branching via variable state.
Fire ACAP Event
Fire an ACAP event visible to other Axis applications and built-in action rules on the device.
| Option | Description |
|---|---|
| Event | Choose a preset event (RuleFired, RuleError, EngineReady) or define a Custom event. |
| Event ID | (Custom only) Unique event identifier string. |
| Type | (Custom only) Stateless (one-shot) or Stateful (has active/inactive state). |
| State | (Stateful only) High (active) or Low (inactive). |
Device Event Query
Fetch the latest cached data from any device event and inject it as {{trigger.FIELD}} variables for subsequent actions. Used for polling sensor values on a schedule trigger.
| Option | Description |
|---|---|
| Topic filter | Partial topic string to identify the event to query (e.g. AirQuality). |
Set Device Parameter
Update any camera parameter via param.cgi.
| Option | Description |
|---|---|
| Parameter | Full parameter name (e.g. root.ImageSource.I0.Sensor.Brightness). Tab out of the field to look up the live value. |
| Value | New value. |
ACAP Control
Start, stop, or restart another installed ACAP application on the camera.
| Option | Description |
|---|---|
| Application | Select from installed ACAP apps (loaded from the camera). |
| Operation | Start, Stop, or Restart. |
InfluxDB Write
Write a data point to InfluxDB using line protocol.
| Option | Description |
|---|---|
| Version | InfluxDB v1 or v2. |
| URL | InfluxDB server URL. |
| Database / Bucket | v1: database name. v2: bucket name. |
| Auth | v1: username/password. v2: API token. |
| Measurement | Line protocol measurement name. Template substitution supported. |
| Tags | Optional tag key=value pairs. Template substitution supported. |
| Fields | At least one field key=value pair. Template substitution supported. |
AOA Get Counts
Fetch accumulated crossline counts from an Axis Object Analytics scenario and inject them as template variables for use in subsequent actions.
| Variable | Description |
|---|---|
| {{aoa_total}} | Total crossings |
| {{aoa_human}} | Human crossings |
| {{aoa_car}} | Car crossings |
| {{aoa_truck}} | Truck crossings |
| {{aoa_bus}} | Bus crossings |
| {{aoa_bike}} | Bike crossings |
| {{aoa_otherVehicle}} | Other vehicle crossings |
| {{aoa_timestamp}} | Timestamp of latest count |
Enable Reset after fetch to zero the counters after reading them.
While-Active Actions
Several actions support a While active mode: Recording, Overlay Text, Siren / Light, and I/O Output. When enabled, the action automatically reverses itself (stops recording, clears overlay, stops siren, resets output) when the triggering condition clears.
This is useful for scenarios like "record while motion is detected" or "activate siren while I/O port 1 is high". The rule must use a stateful trigger (e.g. a Device Event that has active/inactive states) for while-active to function correctly.
Rule Templates
Click the Templates button on the Rules tab to browse a library of pre-built starter rules. Templates provide a ready-made configuration that you can customise after applying. Available templates include:
- Device Event → HTTP Webhook
- Device Event → Email Alert
- Device Event → Slack / Teams / Telegram
- Daily Schedule → Syslog
- MQTT Message → Set Variable
- I/O Input → I/O Output
- I/O Input → Siren + MQTT
- Hourly Snapshot → FTP Upload
- Manual → PTZ + Overlay
- Motion → Recording (Business Hours)
- Arm / Disarm System via MQTT (3 rules)
- AOA Object Detection → MQTT
- Schedule → InfluxDB Sensor Write
- Device Event → Notification Digest
- Sunrise / Sunset → IR Cut Filter
- Counter Threshold → Slack Alert
Applying a template opens the rule editor pre-filled with the template's triggers, conditions, and actions. Modify any field before saving.
Dynamic Variables
Most text fields in actions support {{variable}} substitution. Click Insert variable in the rule editor to browse available values for the current trigger type.
Global variables (always available)
| Variable | Value |
|---|---|
| {{timestamp}} | ISO 8601 UTC timestamp at the moment of firing |
| {{date}} | YYYY-MM-DD |
| {{time}} | HH:MM:SS (24-hour) |
| {{camera.serial}} | Camera serial number |
| {{camera.model}} | Camera model name |
| {{camera.ip}} | Camera IP address |
| {{trigger_json}} | Full trigger event data as a compact JSON string |
Trigger variables (set by the fired trigger)
| Variable | Source |
|---|---|
| {{trigger.KEY}} | Individual field from the trigger event (e.g. {{trigger.CO2}} from an air quality event) |
| {{trigger.topic}} | MQTT topic (MQTT Message trigger) |
| {{trigger.payload}} | MQTT payload (MQTT Message trigger) |
| {{trigger.scenario_id}} | AOA scenario ID (AOA Scenario trigger) |
| {{trigger.object_class}} | Detected object class (AOA Scenario trigger) |
| {{trigger.snapshot_base64}} | Base64-encoded JPEG (when Attach snapshot is enabled on HTTP Request) |
Named variables and counters
| Variable | Value |
|---|---|
| {{var.NAME}} | Value of a named variable (set with Set Variable action) |
| {{counter.NAME}} | Current value of a named counter |
Example — MQTT payload with sensor data:
Camera {{camera.serial}} at {{timestamp}}: {{trigger_json}}
Arm / Disarm Pattern
Use the Variable Compare condition with a variable named system.armed (value "true" or "false") to make rules only fire when the system is armed.
Example rules to implement this (available in the Templates picker):
- Arm System via MQTT — subscribe to
cameras/<serial>/arm, setsystem.armed = "true" - Disarm System via MQTT — same topic, set
system.armed = "false" - Motion Alert When Armed — motion trigger + Variable Compare condition:
system.armed = "true"
You can also arm/disarm via an HTTP webhook, a schedule, an I/O input, or any other trigger.
MQTT Setup
Configure the MQTT broker in Settings → MQTT Broker. The built-in client supports MQTT 3.1.1.
| Option | Description |
|---|---|
| Broker Host | Hostname or IP of the MQTT broker (e.g. 192.168.1.100 or broker.hivemq.com). |
| Port | Default 1883; use 8883 for TLS. |
| Client ID | Unique identifier sent to the broker. Default: acap_event_engine. |
| Username / Password | Optional broker credentials. Password is stored separately and never returned via GET. |
| Keepalive | MQTT keepalive interval in seconds. Default: 60. |
| Use TLS | Enable TLS/SSL encryption for secure broker connections. |
| Enabled | Toggle MQTT on or off without clearing settings. |
Features:
- QoS 0 and QoS 1 publish
- Wildcard topic subscriptions (
+and#) - Automatic reconnect with exponential backoff
- TLS/SSL encryption
The Settings tab shows a live connection status indicator next to "MQTT BROKER".
Application Settings
Location
Set the camera's latitude and longitude (decimal degrees). This is required for Sunrise/Sunset triggers and the Day/Night condition to work correctly.
- North latitude is positive (e.g.
59.3293for Stockholm) - South latitude is negative (e.g.
-33.8688for Sydney) - East longitude is positive (e.g.
18.0686) - West longitude is negative (e.g.
-73.9442for New York)
Email (SMTP)
Configure once and reuse across all email actions.
| Option | Description |
|---|---|
| SMTP Server | Use host:port format (e.g. smtp.gmail.com:587). |
| Use TLS | Enable STARTTLS. Recommended for port 587. |
| Username / Password | SMTP credentials. |
| From Address | Sender address used in all outbound emails. |
SOCKS5 Proxy
Route all outbound connections (HTTP actions, HTTP conditions, and MQTT) through a SOCKS5 proxy. Leave blank to connect directly.
Set to localhost:1055 to tunnel all traffic over Axis Tailscale ACAP.
Device Capabilities
The Settings tab automatically detects and displays your camera's capabilities:
- Status cards — total rules, enabled rules, events today
- Device info — model, serial number, IP address, firmware version, engine version
- PTZ — number of presets per channel
- Audio clips — available media clips
- Siren / Light — available profiles
- Privacy masks — configured masks
- Guard tours — configured tours
- Object Analytics (AOA) — installed scenarios
- Installed ACAPs — other ACAP applications on the camera
These capabilities are used to populate dropdowns in the rule editor (PTZ presets, audio clips, siren profiles, guard tours, AOA scenarios, ACAP apps, privacy masks). If a capability is not available on your camera, the corresponding action types will show an empty dropdown.
Event Log
The Event Log tab shows the most recent rule firings. Each entry includes:
- Time — exact timestamp of firing
- Rule — which rule fired
- Result — success or error code
- Details — additional context (trigger data, error message)
Use the rule filter dropdown to scope the log to a single rule. Click Refresh to reload. Click Clear to empty the log.
Variables Tab
The Variables tab shows all named variables and counters currently stored on the camera. You can:
- View the current value of any variable or counter
- Edit a variable value directly
- Delete a variable or counter
Variables are persistent — they survive ACAP restarts and in-place updates.
Backup & Restore
Use the Settings → Backup & Restore section to export your configuration before performing updates or camera replacements.
- Export Rules — download all rules as a JSON file
- Import Rules — upload a previously exported rules JSON
- Export Settings — download MQTT, SMTP, location, and proxy settings
- Import Settings — restore a settings file
Rules can also be exported individually using Export from the rule card's action menu, producing a portable single-rule JSON file that can be shared and imported on any camera.
REST API
All endpoints are under /local/acap_event_engine/ and require HTTP Basic Auth with admin credentials.
| Method | Path | Description |
|---|---|---|
| GET / POST / DELETE | /rules | Rule CRUD. POST without id creates; POST with ?id= updates. GET with ?id=<id>&action=export downloads a rule as JSON. |
| POST | /fire | Fire a rule manually or via webhook token. |
| GET | /triggers | Available trigger types and their schemas. |
| GET | /actions | Available action types and their schemas. |
| GET / POST / DELETE | /variables | Named variables and counters. |
| GET | /events | Event log (most recent rule firings). |
| GET | /engine | Engine status, MQTT status, device info. |
| GET | /aoa | List configured AOA scenarios (id, name, type). |
| GET / POST | /settings | Engine, MQTT, SMTP, and device configuration. |
For interactive documentation, open API Docs.
Event Engine — MIT License