[Connection] # Connection type: serial or ble # serial: Connect via USB serial port # ble: Connect via Bluetooth Low Energy connection_type = serial # Serial port (for serial connection) # Common ports: /dev/ttyUSB0, /dev/tty.usbserial-*, COM3 (Windows) serial_port = /dev/ttyUSB0 # BLE device name (for BLE connection) # Leave commented out for auto-detection, or specify exact device name #ble_device_name = MeshCore # Connection timeout in seconds timeout = 30 [Bot] # Bot name for identification and logging bot_name = MeshCoreBot # RF Data Correlation Settings # Time window for correlating RF data with messages (seconds) rf_data_timeout = 15.0 # Time to wait for RF data correlation (seconds) message_correlation_timeout = 10.0 # Enable enhanced correlation strategies enable_enhanced_correlation = true # Bot node ID (leave empty for auto-assignment) node_id = # Enable/disable bot responses # true: Bot will respond to keywords and commands # false: Bot will only listen and log messages enabled = true # Passive mode (only listen, don't respond) # true: Bot will not send any messages # false: Bot will respond normally passive_mode = false # Rate limiting in seconds between messages # Prevents spam by limiting how often the bot can send messages rate_limit_seconds = 10 # Bot transmission rate limit in seconds between bot messages # Prevents bot from overwhelming the mesh network bot_tx_rate_limit_seconds = 1.0 # Transmission delay in milliseconds before sending messages # Helps prevent message collisions on the mesh network # Recommended: 100-500ms for busy networks, 0 for quiet networks tx_delay_ms = 250 # DM retry settings for improved reliability (meshcore-2.1.6+) # Maximum number of retry attempts for failed DM sends dm_max_retries = 3 # Maximum flood attempts (when path reset is needed) dm_max_flood_attempts = 2 # Number of attempts before switching to flood mode dm_flood_after = 2 # Timezone for bot operations # Use standard timezone names (e.g., "America/New_York", "Europe/London", "UTC") # Leave empty to use system timezone timezone = [Jokes] # Enable or disable the joke command # true: Joke command is available # false: Joke command is disabled joke_enabled = true # Enable seasonal joke defaults # When enabled, October defaults to spooky jokes, December defaults to Christmas jokes # true: Seasonal defaults are applied # false: No seasonal defaults (always random) seasonal_jokes = true # Enable or disable the dad joke command # true: Dad joke command is available # false: Dad joke command is disabled dadjoke_enabled = true # Handle long jokes (over 130 characters) # false: Fetch new jokes until we get a short one # true: Split long jokes into multiple messages long_jokes = false # Send startup advert when bot finishes initializing # false: No startup advert (default) # zero-hop: Send local broadcast advert # flood: Send network-wide flood advert startup_advert = false # Auto-manage contact list when new contacts are discovered # device: Device handles auto-addition using standard auto-discovery mode, bot manages contact list capacity (purge old contacts when near limits) # bot: Bot automatically adds new companion contacts to device, bot manages contact list capacity (purge old contacts when near limits) # false: Manual mode - no automatic actions, use !repeater commands to manage contacts (default) auto_manage_contacts = false # Interval-based advertising settings # Send periodic flood adverts at specified intervals # 0: Disabled (default) # >0: Send flood advert every N hours advert_interval_hours = 0 [Keywords] # Keyword-response pairs (keyword = response format) # Available fields: {sender}, {connection_info}, {snr}, {timestamp}, {path} # {sender}: Name/ID of message sender # {connection_info}: "Direct connection (0 hops)" or "Routed through X hops" # {snr}: Signal-to-noise ratio in dB # {timestamp}: Message timestamp in HH:MM:SS format # {path}: Message routing path (e.g., "01,5f (2 hops)") # {rssi}: Received Signal Strength Indicator in dBm test = "ack {sender}{phrase_part} | {connection_info} | Received at: {timestamp}" ping = "Pong!" pong = "Ping!" help = "Bot Help: test (or t), ping, help, hello, cmd, advert, @string, wx, aqi, sun, moon, solar, hfcond, satpass, prefix, path, sports, dice, roll, stats | Use 'help ' for details" cmd = "Available commands: test (or t), ping, help, hello, cmd, advert, @string, wx, aqi, sun, moon, solar, hfcond, satpass, prefix, path, sports, dice, roll, stats" [Channels] # Channels to monitor (comma-separated) # Bot will only respond to messages on these channels # Use exact channel names as configured on your MeshCore node monitor_channels = general,test,emergency # Enable DM responses # true: Bot will respond to direct messages # false: Bot will ignore direct messages respond_to_dms = true [Banned_Users] # List of banned user IDs (comma-separated) # Bot will ignore messages from these users banned_users = [Scheduled_Messages] # Scheduled message format: HHMM = channel:message # Time format: HHMM (24-hour, no colon) # Bot will send these messages at the specified times daily # Example: 0800 = general:Good morning! Weather update coming soon. 0800 = general:Good morning! Bot is online and ready. 1200 = general:Midday status check - all systems operational. 1800 = general:Evening update - bot status: Good [Logging] # Log level: DEBUG, INFO, WARNING, ERROR, CRITICAL # DEBUG: Most verbose, shows all details # INFO: Standard logging level # WARNING: Only warnings and errors # ERROR: Only errors # CRITICAL: Only critical errors log_level = INFO # Log file path (leave empty for console only) # Bot will write logs to this file in addition to console log_file = meshcore_bot.log # Enable colored console output # true: Use colors in console output # false: Plain text output colored_output = true # MeshCore library log level (separate from bot log level) # Controls debug output from the meshcore library itself # Options: DEBUG, INFO, WARNING, ERROR, CRITICAL meshcore_log_level = INFO [Custom_Syntax] # Custom syntax patterns for special message formats # Format: pattern = "response_format" # Available fields: {sender}, {phrase}, {connection_info}, {snr}, {timestamp}, {path} # {phrase}: The text after the trigger (for custom syntax patterns) # # Note: The "t" command is now handled by the test command as an alias # "t phrase" works the same as "test phrase" - both use the test response format # Example: "t hello world" -> "ack {sender}: hello world | {connection_info}" [External_Data] # Weather API key (future feature) weather_api_key = # Weather update interval in seconds (future feature) weather_update_interval = 3600 # Tide API key (future feature) tide_api_key = # Tide update interval in seconds (future feature) tide_update_interval = 1800 # N2YO API key for satellite pass information # Get free key at: https://www.n2yo.com/login/ n2yo_api_key = # AirNow API key for AQI data # Get free key at: https://docs.airnowapi.org/ airnow_api_key = # Repeater prefix API URL for prefix command # Default: w0z.is Seattle region API # You can change the region parameter to query different areas repeater_prefix_api_url = https://map.w0z.is/api/stats/repeater-prefixes?region=seattle # Repeater prefix cache duration in hours # How long to cache prefix data before refreshing from API # Recommended: 1-6 hours (data doesn't change frequently) repeater_prefix_cache_hours = 1 [Weather] # Default state for city name disambiguation # When users type "wx seattle", it will search for "seattle, WA, USA" # Use 2-letter state abbreviation (e.g., WA, CA, NY, TX) default_state = WA [Solar_Config] # Default latitude for astronomical calculations (decimal degrees) # Example: 40.7128 for New York City default_latitude = 40.7128 # Default longitude for astronomical calculations (decimal degrees) # Example: -74.0060 for New York City default_longitude = -74.0060 # URL timeout for external API calls (seconds) url_timeout = 10 # Use Zulu/UTC time for astronomical data # true: Use 24-hour UTC format # false: Use 12-hour local format use_zulu_time = false [Channels_List] # Common hashtag channels for the region # Format: channel_name = description # These channels will be listed when users use the 'channels' command # The bot will automatically add the '#' prefix when displaying channels # General channels (no category prefix) general = General discussion and chat weather = Weather updates and conditions emergency = Emergency communications and alerts # Sub-command channels (format: subcommand.channel_name = description) # Example: channels sports -> sports.sounders = Seattle Sounders FC # Sports-focused channels sports.sounders = Seattle Sounders FC sports.kraken = Seattle Kraken sports.mariners = Seattle Mariners sports.seahawks = Seattle Seahawks sports.reign = OL Reign sports.storm = Seattle Storm sports.huskies = Washington Huskies # Local area channels local.capitolhill = Capitol Hill neighborhood local.ballard = Ballard neighborhood local.fremont = Fremont neighborhood local.queenanne = Queen Anne neighborhood # Technology channels tech.mesh = Mesh networking and technical discussions tech.hamradio = Amateur radio and ham radio topics tech.programming = Programming and development tech.iot = Internet of Things projects # Emergency-focused channels emergency.emergency = Emergency communications and alerts emergency.weather = Weather updates and conditions emergency.traffic = Traffic updates and road conditions emergency.hamradio = Amateur radio emergency net [Sports] # Enable or disable the sports command # true: Sports command is available # false: Sports command is disabled sports_enabled = true # Default teams to show when 'sports' command is used without arguments # Comma-separated list of team names (use lowercase) teams = seahawks,mariners,sounders,kraken # Channels where sports command is allowed (leave empty for all channels) # Comma-separated list of channel names channels = general,#bot,#sounders,#seahawks # Channel overrides for sports command # Format: channel_name = default_team # Allows sports command to work in specific channels with default team shortcuts # Example: #sounders = sounders (sports in #sounders becomes "sports sounders") channel_override = #sounders=sounders,#seahawks=seahawks,#kraken=kraken,#mariners=mariners # ESPN API timeout in seconds api_timeout = 10 [Stats] # Enable or disable the stats command # true: Stats command is available # false: Stats command is disabled stats_enabled = true # Data retention settings # Number of days to keep stats data (older data will be automatically cleaned up) # Recommended: 7-30 days to balance storage usage with historical data data_retention_days = 7 # Enable automatic cleanup of old stats data # true: Automatically clean up old data based on data_retention_days # false: Manual cleanup only auto_cleanup = true # Stats collection settings # Track all incoming messages (not just commands) # true: Record all messages for comprehensive stats # false: Only record command executions track_all_messages = true # Track command execution details # true: Record detailed command execution info # false: Basic command tracking only track_command_details = true # Privacy settings # Anonymize user data in stats # true: Replace user IDs with anonymous identifiers # false: Keep actual user IDs in stats anonymize_users = false