Read-only monitoring for Eero mesh networks
Guide for integrating eeroVista with Prometheus for metrics collection and alerting.
eeroVista exposes a /metrics endpoint compatible with Prometheus scraping. This allows you to:
URL: http://<eerovista-host>:8080/metrics
Format: Prometheus text exposition format
Update Frequency: Metrics reflect the latest collected data (typically 30-60 seconds old)
Add this to your prometheus.yml:
scrape_configs:
- job_name: 'eerovista'
scrape_interval: 60s
scrape_timeout: 10s
static_configs:
- targets: ['eerovista:8080']
labels:
instance: 'home'
network: 'eero'
If running Prometheus in Docker alongside eeroVista:
version: '3.8'
services:
eerovista:
image: eerovista:latest
container_name: eerovista
ports:
- "8080:8080"
volumes:
- ./data:/data
networks:
- monitoring
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus-data:/prometheus
networks:
- monitoring
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention.time=30d'
networks:
monitoring:
driver: bridge
volumes:
prometheus-data:
| Metric | Type | Labels | Description |
|---|---|---|---|
eero_device_connected |
gauge | mac, hostname, node | Connection status (1=online, 0=offline) |
eero_device_signal_strength |
gauge | mac, hostname, node | WiFi signal strength (dBm) |
eero_device_bandwidth_mbps |
gauge | mac, hostname, direction | Bandwidth usage (download/upload) |
Example:
eero_device_connected{mac="AA:BB:CC:DD:EE:FF",hostname="Johns-iPhone",node="Living Room"} 1
eero_device_signal_strength{mac="AA:BB:CC:DD:EE:FF",hostname="Johns-iPhone",node="Living Room"} -45
eero_device_bandwidth_mbps{mac="AA:BB:CC:DD:EE:FF",hostname="Johns-iPhone",direction="download"} 125.3
| Metric | Type | Labels | Description |
|---|---|---|---|
eero_network_devices_total |
gauge | - | Total known devices |
eero_network_devices_online |
gauge | - | Currently connected devices |
Example:
eero_network_devices_total 15
eero_network_devices_online 12
| Metric | Type | Labels | Description |
|---|---|---|---|
eero_node_status |
gauge | node, location, gateway | Node status (1=online, 0=offline) |
eero_node_connected_devices |
gauge | node | Devices connected to this node |
Example:
eero_node_status{node="Living Room",location="Living Room",gateway="true"} 1
eero_node_connected_devices{node="Living Room"} 5
| Metric | Type | Labels | Description |
|---|---|---|---|
eero_speedtest_download_mbps |
gauge | - | Latest download speed |
eero_speedtest_upload_mbps |
gauge | - | Latest upload speed |
eero_speedtest_latency_ms |
gauge | - | Latest latency |
Example:
eero_speedtest_download_mbps 950.2
eero_speedtest_upload_mbps 45.8
eero_speedtest_latency_ms 12.4
Count online devices:
sum(eero_device_connected)
Offline devices:
eero_device_connected == 0
Devices per node:
sum by (node) (eero_device_connected)
Average signal strength:
avg(eero_device_signal_strength)
Weak signals (worse than -70 dBm):
eero_device_signal_strength < -70
Signal strength by node:
avg by (node) (eero_device_signal_strength)
Total download bandwidth:
sum(eero_device_bandwidth_mbps{direction="download"})
Top 5 bandwidth consumers:
topk(5, eero_device_bandwidth_mbps{direction="download"})
Upload vs Download ratio:
sum(eero_device_bandwidth_mbps{direction="upload"}) / sum(eero_device_bandwidth_mbps{direction="download"})
Network uptime percentage (last 24h):
avg_over_time(eero_network_devices_online[24h]) / avg_over_time(eero_network_devices_total[24h]) * 100
Speedtest download trend (last 7 days):
avg_over_time(eero_speedtest_download_mbps[7d])
Create an alerts.yml file:
groups:
- name: eero_network
interval: 60s
rules:
# Alert if network has no devices online
- alert: NetworkDown
expr: eero_network_devices_online == 0
for: 5m
labels:
severity: critical
annotations:
summary: "Eero network appears down"
description: "No devices connected for 5 minutes"
# Alert if a specific device goes offline
- alert: DeviceOffline
expr: eero_device_connected{hostname="Critical-Device"} == 0
for: 2m
labels:
severity: warning
annotations:
summary: "Device is offline"
description: " has been offline for 2 minutes"
# Alert if signal strength is poor
- alert: WeakSignal
expr: eero_device_signal_strength < -75
for: 10m
labels:
severity: warning
annotations:
summary: "Weak WiFi signal for "
description: "Signal strength dBm on "
# Alert if speedtest results are degraded
- alert: SlowInternetSpeed
expr: eero_speedtest_download_mbps < 100
for: 30m
labels:
severity: warning
annotations:
summary: "Internet speed degraded"
description: "Download speed Mbps (expected >100Mbps)"
# Alert if an eero node goes offline
- alert: EeroNodeOffline
expr: eero_node_status == 0
for: 5m
labels:
severity: critical
annotations:
summary: "Eero node is offline"
description: "Node at has been offline for 5 minutes"
Reference in prometheus.yml:
rule_files:
- 'alerts.yml'
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093']
A Grafana dashboard for eeroVista is available (coming soon).
Dashboard ID: TBD
Import Steps:
Panel Examples:
1. Network Overview:
eero_network_devices_online / eero_network_devices_totaleero_network_devices_online2. Device List:
eero_device_connected
3. Signal Heatmap:
eero_device_signal_strength
4. Bandwidth Graph:
sum by (direction) (eero_device_bandwidth_mbps)
5. Speedtest History:
eero_speedtest_download_mbps
eero_speedtest_upload_mbps
curl http://eerovista:8080/metrics
http://prometheus:9090/targetsdocker logs prometheus
docker logs eerovista
With many devices, metric cardinality can be high. Consider:
for durations to avoid flappingComplete monitoring stack with Grafana:
version: '3.8'
services:
eerovista:
image: eerovista:latest
networks:
- monitoring
prometheus:
image: prom/prometheus:latest
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- ./alerts.yml:/etc/prometheus/alerts.yml
- prometheus-data:/prometheus
networks:
- monitoring
ports:
- "9090:9090"
grafana:
image: grafana/grafana:latest
volumes:
- grafana-data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
networks:
- monitoring
ports:
- "3000:3000"
alertmanager:
image: prom/alertmanager:latest
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
networks:
- monitoring
ports:
- "9093:9093"
networks:
monitoring:
volumes:
prometheus-data:
grafana-data:
Access:
http://localhost:9090http://localhost:3000 (admin/admin)http://localhost:9093