docs: rewrite README with dashboard screenshots; sanitize config example

This commit is contained in:
Matt Johnson (via Claude) 2026-06-10 04:40:08 +00:00
commit 06047b1e64
5 changed files with 469 additions and 477 deletions

902
README.md

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,12 @@
# MeshAI Configuration
# LLM-powered Meshtastic assistant
#
# Copy this to config.yaml and customize as needed
# Copy this to config.yaml and customize as needed.
# For Docker: mount as /data/config.yaml
#
# Placeholders in <angle brackets> and empty strings ("") are meant to be
# filled in with your own values. Secrets are best supplied via environment
# variables (e.g. ${LLM_API_KEY}) rather than committed to this file.
# === BOT IDENTITY ===
bot:
@ -15,7 +19,7 @@ bot:
connection:
type: tcp # serial | tcp
serial_port: /dev/ttyUSB0 # For serial connection
tcp_host: localhost # For TCP connection (meshtasticd)
tcp_host: localhost # For TCP connection (meshtasticd / node IP)
tcp_port: 4403
# === RESPONSE BEHAVIOR ===
@ -52,15 +56,17 @@ context:
llm:
backend: openai # openai | anthropic | google
api_key: "" # API key (or use LLM_API_KEY env var)
base_url: https://api.openai.com/v1 # API base URL
model: gpt-4o-mini # Model name
base_url: https://api.openai.com/v1 # API base URL (point at a local
# OpenAI-compatible server if desired)
model: gpt-4o-mini # Model name (e.g. gpt-4o-mini,
# claude-sonnet, gemini-2.5-flash)
timeout: 30 # Request timeout (seconds)
system_prompt: >-
You are a helpful assistant on a Meshtastic mesh network.
Keep responses very brief - 1-2 short sentences, under 300 characters.
Only give longer answers if the user explicitly asks for detail or explanation.
Be concise but friendly. No markdown formatting.
google_grounding: false # Enable Google Search grounding (Gemini only, $35/1k queries)
google_grounding: false # Enable Google Search grounding (Gemini only, billed per query)
# === WEATHER ===
weather:
@ -71,11 +77,14 @@ weather:
# === MESHMONITOR INTEGRATION ===
meshmonitor:
enabled: false # Enable MeshMonitor trigger sync
url: "" # MeshMonitor web UI URL (e.g. http://192.168.1.100:3333)
url: "" # MeshMonitor web UI URL (e.g. http://<meshmonitor-host>:3333)
inject_into_prompt: true # Include trigger list in LLM prompt
refresh_interval: 300 # Seconds between trigger refreshes
# === KNOWLEDGE BASE (RAG) ===
# Optional. With no external services, MeshAI uses a self-contained
# on-device SQLite knowledge base. To use a network Qdrant hybrid backend
# instead, configure your own qdrant_host / tei_host (see README).
knowledge:
enabled: false # Enable knowledge base search
db_path: "" # Path to knowledge SQLite database
@ -84,7 +93,7 @@ knowledge:
# === MESH DATA SOURCES ===
# Connect to Meshview and/or MeshMonitor instances for live mesh
# network analysis. Supports multiple sources. Configure via TUI
# with meshai --config (Mesh Sources menu).
# with `meshai --config` (Mesh Sources menu).
#
# mesh_sources:
# - name: "my-meshview"
@ -95,17 +104,17 @@ knowledge:
#
# - name: "my-meshmonitor"
# type: meshmonitor
# url: "http://192.168.1.100:3333"
# url: "http://<meshmonitor-host>:3333"
# api_token: "${MM_API_TOKEN}"
# refresh_interval: 300
# enabled: true
#
# - name: "mqtt-broker"
# type: mqtt
# host: "mqtt.meshtastic.org"
# host: "<mqtt-broker-host>"
# port: 1883
# username: "meshdev"
# password: "large4cats"
# username: "${MQTT_USER}"
# password: "${MQTT_PASSWORD}"
# topic_root: "msh/US"
# use_tls: false
# enabled: true
@ -123,7 +132,7 @@ mesh_sources: []
# packet_threshold: 500 # Non-text packets per 24h to flag
# battery_warning_percent: 30 # Battery level for warnings
# infra_overrides: [] # Node IDs to exclude from infrastructure
# region_labels: {} # Override auto-names: {"Twin Falls": "Magic Valley"}
# region_labels: {} # Override auto-names: {"<auto-name>": "<local-name>"}
mesh_intelligence:
enabled: false
region_radius_miles: 40.0
@ -135,22 +144,22 @@ mesh_intelligence:
region_labels: {}
# === ENVIRONMENTAL FEEDS ===
# Live situational awareness from NWS, NOAA Space Weather, and Open-Meteo.
# Live situational awareness from NWS, NOAA Space Weather, Open-Meteo, and more.
# Provides weather alerts, HF propagation assessment, and tropospheric ducting.
# All geographic values below are placeholders — set them for your own area.
#
environmental:
enabled: false
nws_zones:
- "IDZ016" # Western Magic Valley
- "IDZ030" # Southern Twin Falls County
nws_zones: [] # Your NWS public-forecast zone IDs, e.g. ["XXZ001", "XXZ002"]
# Look yours up at https://www.weather.gov/pimar/PubZone
# NWS Weather Alerts (api.weather.gov)
nws:
enabled: true
tick_seconds: 60
areas: ["ID"]
areas: [] # State/marine codes, e.g. ["ID"]
severity_min: "moderate"
user_agent: "(meshai.example.com, ops@example.com)" # REQUIRED by NWS
user_agent: "(meshai.example.com, ops@example.com)" # REQUIRED by NWS — use your own contact
# NOAA Space Weather (services.swpc.noaa.gov)
swpc:
@ -160,20 +169,20 @@ environmental:
ducting:
enabled: true
tick_seconds: 10800 # 3 hours
latitude: 42.56 # center of mesh coverage area
longitude: -114.47
latitude: 0.0 # center of your mesh coverage area
longitude: 0.0
# NIFC Fire Perimeters (Phase 2)
# NIFC Fire Perimeters
fires:
enabled: false
tick_seconds: 600
state: "US-ID"
state: "" # e.g. "US-ID"
# Avalanche Advisories (Phase 2)
# Avalanche Advisories
avalanche:
enabled: false
tick_seconds: 1800
center_ids: ["SNFAC"]
center_ids: [] # Your avalanche center ID(s), e.g. ["XXFAC"]
season_months: [12, 1, 2, 3, 4]
# USGS Stream Gauges (waterservices.usgs.gov)
@ -181,7 +190,7 @@ environmental:
usgs:
enabled: false
tick_seconds: 900 # Min 15 min per USGS guidelines
sites: [] # e.g. ["13090500", "13088000"]
sites: [] # e.g. ["XXXXXXXX", "XXXXXXXX"]
# TomTom Traffic Flow (api.tomtom.com, requires API key)
traffic:
@ -189,22 +198,22 @@ environmental:
tick_seconds: 300
api_key: "" # Get key at developer.tomtom.com
corridors: []
# Example corridors:
# - name: "I-84 Twin Falls"
# lat: 42.56
# lon: -114.47
# Example corridor:
# - name: "<route name>"
# lat: 0.0
# lon: 0.0
# 511 Road Conditions (state-specific, configurable base URL)
roads511:
enabled: false
tick_seconds: 300
api_key: ""
base_url: "" # e.g. "https://511.idaho.gov/api/v2"
base_url: "" # e.g. "https://511.<state>.gov/api/v2"
endpoints: ["/get/event"]
bbox: [] # [west, south, east, north]
# NASA FIRMS Satellite Fire Detection
# Early warning via satellite hotspots, hours before official perimeters
# Early warning via satellite hotspots, hours before official perimeters.
# Get MAP_KEY at: https://firms.modaps.eosdis.nasa.gov/api/area/
firms:
enabled: false
@ -217,32 +226,26 @@ environmental:
proximity_km: 10.0 # km to match known fire perimeters
# === NOTIFICATION DELIVERY (TRANSITIONAL) ===
# NOTE: This notifications schema will be replaced in v0.3 by the 8-toggle model.
# These rule examples are transitional until Phase 1.2 lands. Do not extend.
# Severity levels: routine (informational), priority (needs attention), immediate (act now)
#
# === NOTIFICATION DELIVERY ===
# Route alerts to channels (mesh, email, webhook) based on rules.
# Categories match alert types from alert_engine.py.
# Categories match alert types from the alert engine.
# Severity levels: routine (informational), priority (needs attention), immediate (act now)
notifications:
enabled: false
quiet_hours_enabled: true # Master toggle for quiet hours feature
quiet_hours_start: "22:00" # Suppress non-emergency alerts during quiet hours
quiet_hours_end: "06:00"
# Digest scheduler settings
# The digest collects priority/routine events and delivers a summary
# Digest scheduler: collects priority/routine events and delivers a summary
# at the configured time to rules with trigger_type='schedule' and
# schedule_match='digest'.
digest:
schedule: "07:00" # HH:MM local time to fire digest
include: [] # Toggle names to include (empty = default set)
# Default set: weather, fire, seismic, avalanche, roads, mesh_health, tracking, other
# Excludes rf_propagation by default
# Example: include: ["weather", "fire", "mesh_health"]
# Notification rules - each rule is self-contained with its own delivery config
# Default baseline rules are created on fresh install
# Notification rules - each rule is self-contained with its own delivery config.
# Default baseline rules are created on a fresh install.
rules:
# Emergency Broadcast - all emergencies go out immediately
- name: "Emergency Broadcast"
@ -289,7 +292,6 @@ notifications:
override_quiet: false
# Example: Morning Digest -> mesh broadcast
# Delivers the accumulated digest at the configured schedule time
# - name: "Morning Digest Mesh"
# enabled: false
# trigger_type: schedule
@ -303,38 +305,22 @@ notifications:
# trigger_type: schedule
# schedule_match: "digest"
# delivery_type: email
# smtp_host: "smtp.gmail.com"
# smtp_host: "<smtp-host>"
# smtp_port: 587
# smtp_user: "you@gmail.com"
# smtp_user: "<you@example.com>"
# smtp_password: "${SMTP_PASSWORD}"
# smtp_tls: true
# from_address: "meshai@yourdomain.com"
# recipients: ["admin@yourdomain.com"]
# from_address: "meshai@example.com"
# recipients: ["admin@example.com"]
# Example: Fire alerts -> email
# - name: "Fire Alerts Email"
# enabled: true
# trigger_type: condition
# categories: ["wildfire_proximity", "new_ignition"]
# min_severity: "routine"
# delivery_type: email
# smtp_host: "smtp.gmail.com"
# smtp_port: 587
# smtp_user: "you@gmail.com"
# smtp_password: "${SMTP_PASSWORD}"
# smtp_tls: true
# from_address: "meshai@yourdomain.com"
# recipients: ["admin@yourdomain.com"]
# cooldown_minutes: 30
# Example: All warnings -> Discord webhook
# - name: "Discord Alerts"
# Example: All warnings -> webhook (Discord/Slack/etc.)
# - name: "Webhook Alerts"
# enabled: true
# trigger_type: condition
# categories: []
# min_severity: "priority"
# delivery_type: webhook
# webhook_url: "https://discord.com/api/webhooks/..."
# webhook_url: "${ALERT_WEBHOOK_URL}"
# cooldown_minutes: 10
# Example: Rule with no delivery (matches and logs, but doesn't send)

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

BIN
screenshots/dashboard.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 KiB