Skip to content

Configuration

All settings live in config/config.ini. The file ships with working defaults; everything below is the full reference.

[MQTT]

Key Default Meaning
Host / Port localhost / 1883 broker address
Topic meshtastic/receive the single ingest topic
Username / Password unset broker credentials (Mosquitto 2.x disables anonymous access by default)
UseTLS / CAFile off TLS to the broker (typically port 8883)

[Files]

Key Default Meaning
Whitelist config/whitelist.txt known MACs, one per line, hot-reloaded on change
Nodes config/nodes.json node id → static GPS coordinates
Database logs/detections.db SQLite path
RetentionDays 0 prune detections/events/notifications older than this (0 = keep forever)

[Filtering]

Key Default Meaning
RSSIMin -120 drop weaker sightings (-75 suits WiFi/BLE proximity; LoRa-relayed sightings arrive at -90..-120)
EMAlpha 0.6 RSSI smoothing factor
StateTimeoutSeconds 3600 forget unseen MACs after this
AlertCooldownSeconds 300 per-MAC re-alert suppression
DwellSeconds 0 alert only once a device persisted this long (0 = first sighting)
VehicleAlertCooldownSeconds 300 per-node vehicle re-alert suppression
KnockAlertCooldownSeconds 300 per-node knock re-alert suppression
ShakeAlertCooldownSeconds 120 per-node shake re-alert suppression (lower: high-confidence)
ContactAlertCooldownSeconds 60 per-node contact re-alert suppression; also absorbs Detection Sensor state re-broadcasts

[Sensors]

Key Default Meaning
ExpectedSensors empty comma-separated node ids the watchdog monitors
SensorTimeoutSeconds 900 alert if an expected sensor is silent this long
HeartbeatTopic meshtripwire/heartbeat sensors may publish liveness here

[Arming]

Key Default Meaning
Schedule empty armed window HH:MM-HH:MM local (wraps midnight); empty = always armed
ControlTopic meshtripwire/arm publish armed/disarmed/auto to override the schedule
ControlSecret empty shared secret: control messages become {"cmd":...,"secret":...}
ControlOverrideTTL 3600 manual overrides auto-revert to the schedule (0 = never)

[Correlation]

Key Default Meaning
CorrelationMinTypes 2 distinct sensor types within the window that trigger a combined alert
CorrelationWindowSeconds 120 the clustering window
CorrelationCooldownSeconds 600 minimum seconds between combined alerts

[Notifications]

Channel switches: EnableNtfy, EnableWebhook, EnableTwilio, EnableSmtp, EnableMqtt. Per-channel settings are documented in Alerts & Notifications.

Cutting false alarms

Alerting on every unknown MAC is unusable: MAC randomization means constant strangers. Three gates, all in config.ini:

  • Dwell (DwellSeconds): only alert once a device has persisted, so a passing car is ignored and someone loitering isn't. The single biggest false-positive reducer; try 120–300 s.
  • Arming (Schedule = 22:00-06:00): only alert during away/asleep hours, or drive it live over ControlTopic (e.g. a phone-presence automation disarms while you're home). Set ControlSecret so a random broker client can't disarm you; overrides auto-revert after ControlOverrideTTL.
  • Sensor watchdog (ExpectedSensors = gate,fence): alerts if a listed sensor goes silent, so a dead node or downed mesh link doesn't become a silent blind spot.