Read-only monitoring for Eero mesh networks
Guide for integrating eeroVista with Zabbix for network monitoring and alerting.
eeroVista provides Zabbix-compatible endpoints for:
New in v2.0+: All Zabbix endpoints now support filtering by network name.
If you have multiple Eero networks (e.g., home and office), you can:
network query parameter to filter devices, nodes, and metrics by networkQuery Parameter: Add ?network=NetworkName to any Zabbix endpoint URL.
Backwards Compatibility: If the network parameter is not specified, eeroVista defaults to the first available network.
Example URLs:
# Default (first network)
http://eerovista:8080/api/zabbix/discovery/devices
# Specific network
http://eerovista:8080/api/zabbix/discovery/devices?network=Home
http://eerovista:8080/api/zabbix/data?item=network.devices.total&network=Office
┌──────────┐ HTTP ┌───────────┐ Eero API ┌──────────┐
│ Zabbix │──────────────> eeroVista │──────────────> │ Eero │
│ Server │ polls │ │ queries │ Network │
└──────────┘ └───────────┘ └──────────┘
eeroVista provides two pre-built Zabbix templates to fit different network sizes and monitoring preferences.
File: templates/zabbix_template_eerovista.xml
Best for: Networks with <50 devices
What it does:
Quick Import:
# Download the template
wget https://raw.githubusercontent.com/Yeraze/eeroVista/main/templates/zabbix_template_eerovista.xml
# Then import via Zabbix web interface:
# Configuration → Templates → Import
File: templates/zabbix_template_eerovista_complete.xml
Best for: Networks with 50+ devices, or when you want granular host-level management
What it does:
eeroVista-Device-{hostname}eeroVista-Node-{nodename}Prerequisites: Before importing, create these host groups in Zabbix:
eeroVista/DeviceseeroVista/NodesQuick Import:
# Download the template
wget https://raw.githubusercontent.com/Yeraze/eeroVista/main/templates/zabbix_template_eerovista_complete.xml
# Then import via Zabbix web interface:
# Configuration → Templates → Import
Setup Steps:
eeroVista/Devices and eeroVista/Nodes{$EEROVISTA_SCHEME} = http or https{$EEROVISTA_PORT} = 8080 (or your port){$PARENT_HOST} = hostname or IP of eeroVista server (e.g., 192.168.1.100)Both templates include:
{$EEROVISTA_SCHEME} macroSee: templates/README.md for detailed import instructions and configuration guide.
If you prefer to configure everything manually instead of using the template:
eeroVistaEero NetworkNetwork DevicesName: Device Discovery
Type: Agent (active)
Key: web.page.get[{$EEROVISTA_SCHEME}://{HOST.CONN}:{$EEROVISTA_PORT}/api/zabbix/discovery/devices]
Update interval: 5m
LLD Macros:
{#MAC} - Device MAC address{#HOSTNAME} - Device hostname{#NICKNAME} - Device nickname{#TYPE} - Device type{#NETWORK} - Network name (NEW in v2.0+)Item Prototypes:
| Name | Key | Type | Value Type |
|---|---|---|---|
| Device [{#HOSTNAME}]: Connected | device.connected[{#MAC}] |
Agent | Numeric |
| Device [{#HOSTNAME}]: Signal | device.signal[{#MAC}] |
Agent | Numeric |
| Device [{#HOSTNAME}]: Download | device.bandwidth.down[{#MAC}] |
Agent | Numeric (float) |
| Device [{#HOSTNAME}]: Upload | device.bandwidth.up[{#MAC}] |
Agent | Numeric (float) |
Trigger Prototypes:
| Name | Expression | Severity |
|---|---|---|
| Device [{#HOSTNAME}] is offline | last(/device.connected[{#MAC}])=0 |
Warning |
| Device [{#HOSTNAME}] weak signal | last(/device.signal[{#MAC}])<-70 |
Warning |
Name: Node Discovery
Type: Agent (active)
Key: web.page.get[{$EEROVISTA_SCHEME}://{HOST.CONN}:{$EEROVISTA_PORT}/api/zabbix/discovery/nodes]
Update interval: 10m
LLD Macros:
{#NODE_ID} - Node ID{#NODE_NAME} - Node name{#NODE_MODEL} - Node model{#IS_GATEWAY} - Gateway flag{#NETWORK} - Network name (NEW in v2.0+)Item Prototypes:
| Name | Key | Type | Value Type |
|---|---|---|---|
| Node [{#NODE_NAME}]: Status | node.status[{#NODE_ID}] |
Agent | Numeric |
| Node [{#NODE_NAME}]: Connected Devices | node.devices[{#NODE_ID}] |
Agent | Numeric |
Trigger Prototypes:
| Name | Expression | Severity |
|---|---|---|
| Node [{#NODE_NAME}] is offline | last(/node.status[{#NODE_ID}])=0 |
High |
Network-Wide Items:
| Name | Key | URL | Type | Update Interval |
|---|---|---|---|---|
| Total Devices | network.devices.total |
/api/zabbix/data?item=network.devices.total |
Agent | 1m |
| Online Devices | network.devices.online |
/api/zabbix/data?item=network.devices.online |
Agent | 1m |
| Speedtest Download | speedtest.download |
/api/zabbix/data?item=speedtest.download |
Agent | 5m |
| Speedtest Upload | speedtest.upload |
/api/zabbix/data?item=speedtest.upload |
Agent | 5m |
| Speedtest Latency | speedtest.latency |
/api/zabbix/data?item=speedtest.latency |
Agent | 5m |
| Name | Expression | Severity | Description |
|---|---|---|---|
| Network offline | last(/network.devices.online)=0 |
Disaster | No devices connected |
| Slow internet | last(/speedtest.download)<100 |
Warning | Download <100 Mbps |
| High latency | last(/speedtest.latency)>50 |
Warning | Latency >50ms |
For device-specific items:
http://{HOST.CONN}:8080/api/zabbix/data?item=device.connected[AA:BB:CC:DD:EE:FF]
Replace AA:BB:CC:DD:EE:FF with actual MAC address or use LLD macro {#MAC}.
Zabbix items should extract the value field from JSON response:
Preprocessing steps:
$.valueName: Device Connection Status
Type: Agent (active)
Key: web.page.get[http://{HOST.CONN}:8080/api/zabbix/data?item=device.connected[{#MAC}]]
Update interval: 60s
Preprocessing:
$.valueDefine these macros on the host or template:
| Macro | Default | Description |
|---|---|---|
{$EEROVISTA_PORT} |
8080 |
eeroVista HTTP port |
{$SIGNAL_WARN} |
-70 |
Signal strength warning threshold (dBm) |
{$SIGNAL_CRIT} |
-80 |
Signal strength critical threshold |
{$SPEED_WARN} |
100 |
Download speed warning (Mbps) |
{$LATENCY_WARN} |
50 |
Latency warning (ms) |
Create a single Zabbix host that monitors all networks (default behavior):
network parameter from all URLs{#NETWORK} macro in item names to distinguish between networksWhen to use: Simple setups, single network, or when you want all metrics in one place
Create multiple Zabbix hosts, one for each network:
curl http://eerovista:8080/api/networks
{$NETWORK_NAME} = “Home”{$NETWORK_NAME} = “Office”# Device Discovery for Home network
web.page.get[{$EEROVISTA_SCHEME}://{HOST.CONN}:{$EEROVISTA_PORT}/api/zabbix/discovery/devices?network={$NETWORK_NAME}]
# Node Discovery for Office network
web.page.get[{$EEROVISTA_SCHEME}://{HOST.CONN}:{$EEROVISTA_PORT}/api/zabbix/discovery/nodes?network={$NETWORK_NAME}]
http://{HOST.CONN}:8080/api/zabbix/data?item=network.devices.total&network={$NETWORK_NAME}
When to use: Multiple networks that need independent monitoring, alerting, and reporting
Benefits:
Request:
GET http://eerovista:8080/api/zabbix/discovery/devices
Response:
{
"data": [
{
"{#MAC}": "AA:BB:CC:DD:EE:FF",
"{#HOSTNAME}": "Johns-iPhone",
"{#NICKNAME}": "John's Phone",
"{#TYPE}": "mobile"
},
{
"{#MAC}": "11:22:33:44:55:66",
"{#HOSTNAME}": "Smart-TV",
"{#NICKNAME}": "Living Room TV",
"{#TYPE}": "entertainment"
}
]
}
Request:
GET http://eerovista:8080/api/zabbix/discovery/nodes
Response:
{
"data": [
{
"{#NODE_ID}": "12345",
"{#NODE_NAME}": "Living Room",
"{#NODE_MODEL}": "eero Pro 6E",
"{#IS_GATEWAY}": "true"
},
{
"{#NODE_ID}": "67890",
"{#NODE_NAME}": "Bedroom",
"{#NODE_MODEL}": "eero 6",
"{#IS_GATEWAY}": "false"
}
]
}
Connection Status:
GET /api/zabbix/data?item=device.connected[AA:BB:CC:DD:EE:FF]
Response:
{
"value": 1,
"timestamp": "2025-10-19T14:30:00Z"
}
1 (connected) or 0 (disconnected)Signal Strength:
GET /api/zabbix/data?item=device.signal[AA:BB:CC:DD:EE:FF]
Response:
{
"value": -45,
"timestamp": "2025-10-19T14:30:00Z"
}
Bandwidth:
GET /api/zabbix/data?item=device.bandwidth.down[AA:BB:CC:DD:EE:FF]
Response:
{
"value": 125.3,
"timestamp": "2025-10-19T14:30:00Z"
}
Widgets:
network.devices.onlinenetwork.devices.total, network.devices.onlinespeedtest.download, speedtest.uploadWidgets:
device.signal[*]device.bandwidth.down[*]Configure Zabbix actions to send emails on trigger events:
Action Name: eeroVista Alerts
Conditions:
Operations:
{TRIGGER.STATUS}: {TRIGGER.NAME}Problem: {TRIGGER.NAME}
Host: {HOST.NAME}
Severity: {TRIGGER.SEVERITY}
Time: {EVENT.TIME} {EVENT.DATE}
Details: {ITEM.LASTVALUE}
Device Offline:
last(/device.connected[{#MAC}])=0 and last(/device.connected[{#MAC}],#2)=1last(/device.connected[{#MAC}])=1Weak Signal:
last(/device.signal[{#MAC}])<{$SIGNAL_WARN} for 5mlast(/device.signal[{#MAC}])>{$SIGNAL_WARN}Slow Internet:
avg(/speedtest.download,1h)<{$SPEED_WARN}avg(/speedtest.download,1h)>={$SPEED_WARN}curl http://eerovista:8080/api/zabbix/discovery/devices
tail -f /var/log/zabbix/zabbix_server.log | grep eerovista
device.connected[MAC] format$.value is configuredIf eeroVista is being overloaded:
Zabbix automatically removes discovered items that no longer appear in discovery results using the “Keep lost resources period” setting.
How it works:
Recommended Settings:
For Device Discovery rule:
For Node Discovery rule:
Configuration in Zabbix:
Important Notes:
for durations to avoid flappingTwo production-ready Zabbix templates are available:
Download: templates/zabbix_template_eerovista.xml
Best for networks with <50 devices. Creates one host with Low-Level Discovery for all devices and nodes.
Download: templates/zabbix_template_eerovista_complete.xml
Best for networks with 50+ devices. Automatically creates individual Zabbix hosts for each device and node. Requires Zabbix 6.0+.
Prerequisites: Create host groups eeroVista/Devices and eeroVista/Nodes before importing.
Documentation: templates/README.md
Both templates include:
{$EEROVISTA_SCHEME}, {$EEROVISTA_PORT}, {$PARENT_HOST})Simply import the template and link it to your eeroVista host - no manual configuration needed!