System Configuration
Page: Manage -> System Management
The System Management pages are reached from the top-right Manage menu by selecting "System Management". It is the area where you can set up a variety of system-wide settings.
General Settings~
Page: Manage -> System Management -> General Settings
| Setting | Description |
|---|---|
| Language | Sets the language displayed in the web user interface. "Browser Default" follows the browser's language. |
| Landing Page | The page opened right after login: Dashboard, Real-time Measurement, or System Information. |
| Index Page | The page opened when you click the brand (logo) link in the navigation bar. "Same as Landing Page" reuses the Landing Page choice. |
| System Timezone | The system-wide default timezone, as an IANA name such as Asia/Seoul. It is used for daemon log times and as the last fallback for devices that have no location. Times that people read and write use each person's own timezone from their Account settings. |
| Pyro Timeout | Timeout in seconds for the connection between the web application and the daemon. Restart the backend to apply a change. |
| Enable Daemon Debug Logging | Writes detailed debug messages to the daemon log for diagnosis. It makes the log much larger, so turn it off when you are done. Restart the backend to apply a change. |
| Force HTTPS | Requires the web browser to use SSL/HTTPS. http:// requests are redirected to https://. On Docker this setting is forced off (a direct http:// connection would otherwise stop working), unless the environment variable AOT_BEHIND_TLS=1 is set for a container that is only reached through an HTTPS reverse proxy. See the "Cookies behind a reverse proxy (Docker)" section of the Security page. |
| Hide Success Messages | Hides all success alert boxes shown at the top of the page. |
| Hide Info Messages | Hides all info alert boxes shown at the top of the page. |
| Hide Warning Messages | Hides all warning alert boxes shown at the top of the page. |
| Hide Tooltips | Hides the tooltips that appear when you hover over form fields. |
| Opt out of Statistics Collection | Disables the sending of anonymous usage statistics. This feature helps with development, so please keep it enabled if possible. View Collected Statistics shows exactly what is collected. |
AI Service~
| Setting | Description |
|---|---|
| Enable AI Service | Turns the AI service on or off. When it is off the AI menu is hidden and AI features are unavailable, but every AI setting is kept. Turning it on only makes AI available; autonomous operation is started separately on the AI page once at least one AI model is registered. This is an experimental feature. |
| Translate User-Defined Names | Names you typed yourself (device, zone, crop names) stay in the language you wrote them in. Turn this on to also show them in the interface language. The stored names are never changed. Translations you enter under Name Translations are shown even without an AI engine. |
| Enable External MCP Server | Allows or refuses requests from external MCP clients (for example Claude Desktop) to the MCP server that is already running. It takes effect immediately. The address and port it listens on are not set here: on Docker edit the ports: entry of the aot_mcp service and run docker compose up -d again; on a native install edit and restart the aotmcp systemd service. |
There is no site-name field on this page. The name shown in the navigation bar and the browser tab is set under Manage -> System Management -> Custom UI (Brand Text); see Custom UI below for branding and colors.
Custom UI~
Page: Manage -> System Management -> Custom UI
This page customizes the branding and color palette of the web interface — useful for putting your own name and logo on AoT, or simply changing its color scheme. A live preview at the top of the page shows every color as you change it; nothing is applied elsewhere until you click Save.
| Setting | Description |
|---|---|
| Brand Display | What appears in the navigation bar\: the default AoT branding, the hostname, custom text, or an uploaded image. |
| Title Display | What appears in the browser tab title\: the hostname or custom brand text. |
| Brand Text | Custom text used in place of the hostname when Brand Display or Title Display is set to use it. |
| Brand Image | An uploaded logo (JPG, PNG, GIF, SVG, or WebP) used when Brand Display is set to Brand Image. |
| Brand Image Height | Height of the uploaded brand image, in pixels. |
| Favicon Display | Use the default AoT favicon or an uploaded custom icon. |
| Favicon Image | An uploaded icon used when Favicon Display is set to use it. |
Below Branding, colors are organized into groups: Brand Colors is always visible, and the rest appear as tabs. Every color has its own hex input and color picker, and clicking an element in the live preview jumps to the color that controls it.
| Color Group | What it controls |
|---|---|
| Brand Colors | Primary, secondary, and accent tones used for accent icons, drag handles, and AI chat elements. |
| Text Colors | Primary and secondary text, plus the tertiary color used for text on filled buttons and badges. |
| Background Colors | Card and page background colors. |
| State Colors | Device on/off/pending/warning row backgrounds, and the four semantic colors — Success, Warning, Danger, Info — used app-wide for measurement status, alerts, and confirmations, each with a soft tint background/text/border variant. |
| Button Colors | Primary and secondary button backgrounds, and the On/Off/Pause/Hold action button colors. |
| Badge Colors | The AI (LLM) badge, MCP tool badge, and Upgrade-available badge. |
| Measurement Band Colors | The 5 threshold bands (very low to very high) used by gauge widgets and sensor value labels. |
| Chart Series Colors | The default 6 line colors assigned to graph, PID, and calendar widget series. |
Theme Preset switches between built-in palettes (AoT Default, Ocean Blue, Warm Sunset, Minimal Gray, Night Mode) or a palette you saved yourself with Save Preset. Reset to Defaults restores AoT's built-in colors.
| Setting | Description |
|---|---|
| Custom CSS | Additional CSS applied to every page, for changes beyond what the color settings above allow. |
| Custom Layout | Custom HTML injected into the page layout. |
Time Series Database Settings~
Page: Manage -> System Management -> General Settings
Measurements are stored in a time series database. The options currently available in AoT are InfluxDB 1.x and InfluxDB 2.x. InfluxDB 1.x works on both 32-bit and 64-bit operating systems, but 2.x only works on 64-bit operating systems. Therefore, if you are using a 32-bit operating system, you must use InfluxDB 1.x. During AoT installation, you can choose InfluxDB 1.x, 2.x, or no installation. If InfluxDB is not installed, you must specify a separate installation address and credentials so that AoT can store and retrieve measurements.
If installing with Docker, after installation you must change the host name to "aot_influxdb" in order to connect to the InfluxDB Docker container.
| Setting | Description |
|---|---|
| Database | Select the influxdb version to use. |
| Retention Policy | Select the retention policy. The default is "autogen" for v1.x and "infinite" for v2.x. |
| Host Name | The host name used to connect to the time series server. The default is "localhost". |
| Port | The port of the time series database. The default is 8086. |
| Database Name | The name of the database (v1.x) or bucket (v2.x) that AoT stores to and retrieves from. The default is "aot_db". |
| User Name | The user name for accessing the database (if authentication is required). The default is "aot". |
| Password | The password for accessing the database (if authentication is required). |
Dashboard Settings~
Page: Manage -> System Management -> General Settings
| Setting | Description |
|---|---|
| Grid Cell Height (px) | Sets the height of each widget cell in pixels. |
Upgrade Settings~
Page: Manage -> System Management -> General Settings
| Setting | Description |
|---|---|
| Internet Test IP Address | The IP address used to test whether an internet connection is active before an upgrade. Native install only: the Docker Upgrade page does not run this check. |
| Internet Test Port | The port used to test whether an internet connection is active. Native install only. |
| Internet Test Timeout | The timeout duration used when testing the internet connection. Native install only. |
| Check for Updates | Automatically checks for updates every 2 days and displays a notification through the web interface. If a new update is available, the Upgrade item in the Manage menu is highlighted. |
Energy Usage Settings~
Page: Manage -> System Management -> General Settings
To calculate accurate energy usage statistics, you need to know a few characteristics of your electrical system. These variables should describe the characteristics of the electrical system that operates electrical devices through relays.
Note
If you are not using a current sensor, you must set the accurate current usage for each output in order to accurately calculate energy usage (see Output Settings).
| Setting | Description |
|---|---|
| Max Amps (A) | Sets the maximum current allowed at one time. If turning an output on would cause the total of the active devices to exceed this value, the output cannot be turned on, to prevent damage. |
| Voltage (V) | The AC voltage that is switched through the output. Typically 120 or 240. |
| Cost per kWh | Enter the electricity cost per kWh. |
| Currency Unit | The currency unit used for the electricity cost. |
| Day of Month for Meter Reading | The day (1–30) on which the electricity meter is checked. This should match the electricity billing date. |
| Generate Usage/Cost Report | Defines when the energy usage report is generated. Currently only output time-based calculation is supported. |
| Report Generation Frequency | Sets the frequency at which the usage/cost report is automatically generated. |
| Report Generation Day of Week/Month | Sets the day of the week (Daily: 1–7, Monday=1) or the day of the month (1–28) on which the report is generated. |
| Report Generation Hour | Sets the hour at which the report is generated, from 0 to 23. |
Controller Sampling Period Settings~
Page: Manage -> System Management -> General Settings
Each controller for Inputs, Outputs, and Functions operates periodically. The fastest speed at which each controller can respond is determined by that controller's sampling period. The controller pauses its loop for the duration of the period. For example, if the Output controller's sampling period is set to 1 second, an output on/off command will react within at most 1 second.
| Setting | Description |
|---|---|
| Max Amps | Sets the maximum current (A) allowed at one time. If a command to turn an output on would, combined with the devices currently on, exceed this value, the output will not turn on, to prevent damage. |
| Voltage | The AC voltage that is switched through the output. Typically 120 or 240. |
| Cost per kWh | Enter the electricity cost per kWh. |
| Currency Unit | The currency unit used when paying the electricity cost. |
| Day of Month for Meter Reading | The day (1–30) on which the electricity meter is checked. This should match the electricity billing date. |
| Generate Usage/Cost Report | Defines when the energy usage report is generated. Currently only output time-based calculation is supported. |
Input Settings~
Page: Manage -> System Management -> Custom Inputs
Input modules can be imported into AoT for use. These modules must follow a specific format. For details, see Custom Inputs.
| Setting | Description |
|---|---|
| Import Input Module | Select the input module file, then click this button to start the import. |
Output Settings~
Page: Manage -> System Management -> Custom Outputs
Output modules can be imported into AoT for use. These modules must follow a specific format. For details, see Custom Outputs.
| Setting | Description |
|---|---|
| Import Output Module | Select the output module file, then click this button to start the import. |
Function Settings~
Page: Manage -> System Management -> Custom Functions
Function modules can be imported into AoT for use. These modules must follow a specific format. For details, see Custom Functions.
| Setting | Description |
|---|---|
| Import Function Module | Select the function module file, then click this button to start the import. |
Action Settings~
Page: Manage -> System Management -> Custom Actions
Action modules can be imported into AoT for use. These modules must follow a specific format. For details, see Custom Actions.
| Setting | Description |
|---|---|
| Import Action Module | Select the action module file, then click this button to start the import. |
Widget Settings~
Page: Manage -> System Management -> Custom Widgets
Widget modules can be imported into AoT for use. These modules must follow a specific format. For details, see Custom Widgets.
| Setting | Description |
|---|---|
| Import Widget Module | Select the widget module file, then click this button to start the import. |
Measurement Settings~
Page: Manage -> System Management -> Measurements
You can create new measurements, units, and conversions to extend functionality beyond AoT's built-in types and formulas. Before creating a measurement, you must first create the unit, because you need to select a unit when creating a measurement. You can also assign additional units to a measurement that already exists. For example: altitude already exists, but if you want to add the fathom unit, first create the fathom unit, then create the altitude measurement with fathom selected.
| Setting | Description |
|---|---|
| Measurement ID | The ID of the measurement to use in the measurements_dict of the input module (e.g. "length", "width", "speed") |
| Measurement Name | The common name of the measurement (e.g. "Length", "Weight", "Speed") |
| Measurement Units | Select all units associated with the measurement. |
| Unit ID | The ID of the unit to use in the measurements_dict of the input module (e.g. "K", "g", "m") |
| Unit Name | The common name of the unit (e.g. "Kilogram", "Meter") |
| Unit Abbreviation | The abbreviation of the unit (e.g. "kg", "m") |
| Convert From Unit | The unit that the conversion is based on |
| Convert To Unit | The unit to convert to |
| Conversion Equation | The equation used to convert one unit to another. It must contain a lowercase "x" (e.g. "x/1000+20", "250*(x/3)"), and the actual measurement value replaces that x. |
User Settings~
Page: Manage -> System Management -> Users
At least one Admin user is required for AoT's login system to be enabled. If no Admin user exists, the web server redirects to the Admin creation form. This is the first page shown when AoT is started for the first time. After the Admin user has been created, additional users can be created on the User Settings page.
| Setting | Description |
|---|---|
| User Name | Choose a user name between 3 and 64 characters, using only letters and numbers. It is case-insensitive and converted to all lowercase. |
| The email address to associate with the account. | |
| Password/Repeat | Choose a password of at least 8 characters. Commonly used passwords are rejected even if they meet this length. See [Security](Security.md#password-requirements). |
| Keypad Code | A numeric code of 4 or more digits used to log in with a keypad (optional). |
| Role | The role used to set the user's permissions. See the descriptions of the 4 default roles below. |
| Theme | The theme applied to the web user interface. Includes colors, design elements, and so on. |
Roles~
Roles define the permissions of each user. Five default roles are provided (Admin, Editor, Monitor, Guest, and Kiosk, a display-only role that can view the camera and statistics) that determine whether a user can view or edit specific areas of AoT. In addition to the default roles, you can create custom roles.
| Role | Admin | Editor | Monitor | Guest | Kiosk |
|---|---|---|---|---|---|
| Edit Users | X | ||||
| Edit Controllers | X | X | |||
| Edit Settings | X | X | |||
| View Settings | X | X | X | ||
| View Camera | X | X | X | X | |
| View Stats | X | X | X | X | |
| View Logs | X | X | X |
The Edit Controllers permission protects editing of Conditionals, Graphs, LCDs, Methods, PIDs, Outputs, and Inputs. It also protects work tasks for people (weeding, inspection and the like): creating, editing or cancelling one needs this permission wherever it happens — the Scheduler, a note passage, the AI assistant or MCP, or a Google Calendar import. Roles without it can see work tasks but not change them, even if they can edit settings.
The View Stats permission protects viewing of the Usage Statistics, System Information, and Energy Usage pages.
Groups~
Page: Manage -> System Management -> Users -> Groups
Roles and Groups answer two different questions. A Role decides what a user is allowed to do (edit settings, edit controllers, view stats, and so on — see Roles above). A Group decides which dashboards, maps, facilities, and tabs (and the inputs, outputs, functions, and controllers placed on those tabs) a user is allowed to operate. The two combine: to perform an action on something, a user needs both the Role permission for that action, and membership in a Group the target has been granted to.
By default, no resource belongs to any group, so behavior is unchanged from before Groups existed: anyone whose Role allows an action can perform it on anything. This only changes once you grant a Group to a specific resource. From that point on, only members of the granted Group(s) — plus any user whose Role has "Access all groups" enabled — can operate that one resource. Everyone else immediately loses the ability to operate it, so check who currently uses a resource before granting a Group to it.
Groups restrict operating a resource only: turning a device on or off, changing its settings, deleting it, or opening its dashboard/map/facility/tab page. They do not restrict viewing. Sensor readings, history, and exported data remain visible to every logged-in user whether or not they belong to the relevant group.
The same limit applies when you ask the AI assistant or an external MCP client to change something: a change that touches another group's resource is refused, whether that resource is named, given by id, reached through a schedule or sequence step, or only mentioned in the text of a note or request. A scheduled job is checked again each time it runs, against the person responsible for it.
This page (the Groups tab under Users) is only for creating groups and choosing their members. Resources are not granted to a group here.
| Setting | Description |
|---|---|
| Group Name | A name for the group. |
| Description | What the group is for. Without it, nobody can tell later whether the group is still needed. |
| Members | The users who belong to this group. |
A Group is granted to a resource from that resource's own settings, not from this page. Each of the following carries a "Groups that can operate this ___" section in its own settings dialog:
| Resource | Where the group is assigned |
|---|---|
| Tab | The tab's own settings. This also covers every Input, Output, Function, Conditional, Trigger, PID, and Custom Controller placed on that tab — a device does not carry its own group assignment, it always follows the tab it is on. If a device seems to be missing or locked for a user, check the groups granted to its tab. |
| Dashboard | The dashboard's own settings. |
| Map | The map's own settings. |
| Facility | The facility's own settings. |
Notes and scheduled tasks can also be attached to a zone, a site outline, a facility's own boundary, or a section inside a facility drawn on a map — not only to a tab, dashboard, map, or facility. Those shapes are not granted to a group directly; there is no "Groups that can operate this ___" section for them. Instead, a note or task attached to one follows the Facility that contains it, if it is inside one; otherwise it follows the Map it is drawn on. So restricting a Facility also restricts writing notes and tasks anywhere inside its outline, and restricting a Map restricts everything drawn on it that is not inside a Facility. This applies the same way on the notes and schedule screens as it does through the AI assistant or an MCP client.
A Facility does not inherit its Map's groups. If you restrict only the Map, notes and tasks inside its Facilities are not restricted — restrict each Facility as well.
A user can belong to more than one group. When a user's groups disagree about a resource, the widest access applies — belonging to any one group the resource is granted to is enough.
On the Roles screen, a Role can be marked "Access all groups". Users with such a Role bypass every group restriction and can operate every resource regardless of what has been granted — intended for the small number of people who manage the whole system rather than one area of it. The built-in Admin role has this enabled by default.
Raspberry Pi Settings~
Page: Manage -> System Management -> Raspberry Pi
The Raspberry Pi settings configure part of the Linux system on which AoT runs.
This page works only on a Raspberry Pi installation with raspi-config. In Docker (or on any system without raspi-config) it shows a notice instead of the settings.
pigpiod is required to use PWM outputs and PWM, RPM, DHT22, DHT11, and HTU21D inputs.
| Setting | Description |
|---|---|
| Enable/Disable Features | System interfaces (I2C, 1-Wire, Serial Hardware, Serial Login Shell, SPI, SSH) that can be enabled and disabled from the web UI via the raspi-config command. Each row shows the current state read from raspi-config and offers the opposite action. Serial Hardware should be enabled and Serial Login Shell disabled to use serial devices. Changes apply after Manage -> Restart System. On Bookworm, the boot configuration file is /boot/firmware/config.txt. |
| pigpiod Sampling Rate | The sampling rate at which the pigpiod service operates. A lower number allows a faster PWM frequency, but can significantly increase the processor load on a Pi Zero. pigpiod can also be completely disabled if it is not needed (see the note above). |
Alert Settings~
Page: Manage -> System Management -> Alerts
The Alert settings hold the SMTP account AoT uses to send email. Nothing is emailed until a Conditional function with a Send Email action (or one of the other email paths described in Alerts) runs, so configuring this page alone sends no alerts.
| Setting | Description |
|---|---|
| SMTP Host | The SMTP server used to send email. |
| SMTP Port | The port used to communicate with the SMTP server. Leave blank to use the default for the selected protocol (465 for SSL, 587 for TLS, 25 for unencrypted). |
| SMTP Protocol | A dropdown with four choices: SSL, TLS, Unencrypted, and Unencrypted (No Login). The last option skips the SMTP login entirely, for internal relays that do not require one. A warning is shown when an unencrypted protocol is selected. |
| SMTP User | The user name used to sign in to the SMTP server. You can enter just the name or the full email address. |
| SMTP Password | The account's password. The saved password is never shown; enter a value only when you want to change it. |
| From Email | The address shown as the sender. Most providers require it to be the login account itself or an address that account is allowed to send as. |
| Max Emails per Hour | The maximum number of emails the Send Email actions may send per hour (at least 1). Emails beyond the limit are dropped, not queued. See the hourly limit below. |
Click Save to store the settings.
Send a test email~
The Send Test Email section sends one message to the address you type in Test recipient. The test uses the settings that are already saved, not the values currently typed in the form, so click Save first and then send the test. A success or failure message appears at the top of the page.
Using Gmail~
Google does not accept a normal account password for SMTP. Turn on 2-step verification for the Google account, create an app password (Google Account -> Security -> App passwords), and enter that 16-character password as the SMTP password. Use smtp.gmail.com with SSL (port 465) or TLS (port 587), enter the full Gmail address as the SMTP user, and set From Email to the same address, because Gmail rewrites or rejects other sender addresses.
The hourly limit~
The limit applies to the Send Email and Send Email with Photo actions. The counter starts a one-hour window; once the number of emails in that window reaches the limit, further emails are dropped until the window ends. Dropped emails are not sent later. Each one leaves an error line in the daemon log (Wait N seconds to email again; see Log Viewer). The counter also counts attempts made while the limit was already reached.
To clear the counter and start a fresh window immediately, use Reset Email Counter on the Diagnostic page.
Camera Settings~
Page: Manage -> System Management -> Camera
AoT can use multiple cameras simultaneously. Each camera can be used throughout the software after being configured in the Camera settings.
Note
Due to manufacturer-specific hardware and software differences, some options (e.g. hue or white balance) may not be available on certain cameras.
| Setting | Description |
|---|---|
| Type | Select whether the camera is a Raspberry Pi camera or a USB camera. |
| Library | Select the library used to communicate with the camera. Raspberry Pi cameras use picamera, and USB cameras should be set to fswebcam. |
| Device | Specify the device to connect the camera to. Only the fswebcam library uses this option. |
| Output | Sets the output that is activated during still image capture (including time-lapse). |
| Output Duration | Sets the duration for which the output is activated before capturing an image. |
| Rotate Image | Sets the angle by which to rotate the image. |
| ... | Image Width, Image Height, Brightness, Contrast, Exposure, Gain, Hue, Saturation, White Balance. These options are self-explanatory. Not all options may work on all cameras. |
| Pre Command | A command to run as the 'root' user before a still image is captured. |
| Post Command | A command to run as the 'root' user after a still image is captured. |
| Flip Horizontally | Flips or mirrors the image horizontally. |
| Flip Vertically | Flips or mirrors the image vertically. |
Diagnostic Settings~
Page: Manage -> System Management -> Diagnostics
Problems can occur in the system due to incompatible configurations. These can result from a part of the system (Input, Output, etc.) being misconfigured, an update in which the database upgrade was not handled properly, or other unexpected issues. There are times when you need to perform diagnostics to identify the cause of a problem or to resolve the problem itself. The options below are intended to mitigate problems. For example, if the Data -> Dashboard page cannot be accessed because of a misconfigured dashboard element that causes an error, deleting all dashboard elements may be the most economical way to regain access. Note, however, that in this case you will have to re-add all existing dashboard elements.
| Setting | Description |
|---|---|
| Delete All Dashboards | Deletes all dashboards saved on the Data -> Dashboard page. |
| Delete All Inputs | Deletes all inputs on the Setup -> Input page. |
| Delete All Notes and Tags | Deletes all notes and tags on the More -> Note page. |
| Delete All Outputs | Deletes all outputs on the Setup -> Output page. |
| Delete Settings Database | Deletes the aot.db settings database (Warning: this deletes all settings and users). |
| Delete File: .dependency | Deletes the .dependency file. Try this if you have trouble accessing the dependency installation page. |
| Delete File: .upgrade | Deletes the .upgrade file. Try this if you have trouble accessing the upgrade page or running an upgrade. |
| Recreate InfluxDB 1.x Database | Deletes and then recreates the InfluxDB 1.x measurement database. This deletes all measurement data! |
| Recreate InfluxDB 2.x Database | Deletes and then recreates the InfluxDB 2.x measurement database. This deletes all measurement data! |
| Reset Email Counter | Clears the hourly email counter and starts a new one-hour window. Use it when emails are being held back by the hourly limit. |
| Install Dependencies | Starts the script that installs all dependencies required across the entire AoT system. |
| Set Upgrade to Master | Changes FORCE_UPGRADE_MASTER to True in config.py. This is a way to instruct the upgrade system to upgrade to the main branch on GitHub, without having to log in and manually edit the config.py file. |