#config.ini # type can be serial, tcp, or ble # port is the serial port to use, commented out will try to auto-detect # hostname is the IP/DNS and port for tcp type default is host:4403 # mac is the MAC address of the device to connect to for ble type [interface] type = serial port = /dev/ttyACM0 # port = /dev/ttyUSB0 # hostname = meshtastic.local # mac = 00:11:22:33:44:55 # Additional interface for multi radio support [interface2] enabled = False type = serial port = /dev/ttyUSB0 # port = /dev/ttyACM1 # port = COM1 # hostname = localhost # mac = 00:11:22:33:44:55 # example, the third interface would be [interface3] up to 9 [general] # if False will respond on all channels but the default channel respond_by_dm_only = True # Allows auto-ping feature in a channel, False forces to 1 ping only autoPingInChannel = False # defaultChannel is the meshtastic default public channel, e.g. LongFast (if none use -1) defaultChannel = 0 # ignoreDefaultChannel, the bot will ignore the default channel set above ignoreDefaultChannel = False # ignoreChannels is a comma separated list of channels to ignore, e.g. 4,5 ignoreChannels = # require ! to be the first character in a command cmdBang = False # require explicit command, the message will only be processed if it starts with a command word explicitCmd = True # list of favorite nodes numbers ex: 2813308004,4258675309 used by script/addFav.py favoriteNodeList = # motd is reset to this value on boot motd = Thanks for using MeshBOT! Have a good day! welcome_message = MeshBot, here for you like a friend who is not. Try sending: ping @foo or, cmd # whoami whoami = True # enable or disable the Joke module DadJokes = True DadJokesEmoji = False # enable or disable the Solar module spaceWeather = True # enable or disable the RSS module, and truncate the story rssEnable = True rssFeedURL = http://www.hackaday.com/rss.xml,http://rss.slashdot.org/Slashdot/slashdotMain,http://www.reddit.com/r/meshtastic/.rss # RSS feed names must match the order of the URLs above, default is used if no match rssFeedNames = default,slashdot,mesh rssMaxItems = 3 rssTruncate = 100 # enable or disable the 'latest' command which uses NewsAPI.org key at https://newsapi.org/register enableNewsAPI = False newsAPI_KEY = newsAPIregion = us # could also be 'relevancy' or 'popularity' or 'publishedAt' sort_by = relevancy # enable or disable the wikipedia search module wikipedia = True # Use local Kiwix server instead of online Wikipedia # Set to False to use online Wikipedia, or provide Kiwix server URL useKiwixServer = False # Kiwix server URL (e.g., http://127.0.0.1:8080) kiwixURL = http://127.0.0.1:8080 # Kiwix library name (e.g., wikipedia_en_100_nopic_2025-09) kiwixLibraryName = wikipedia_en_100_nopic_2025-09 # Enable LLM local Ollama integration, set true for any LLM support ollama = False # Ollama server instance to use (defaults to local machine install) ollamaHostName = http://localhost:11434 # Use OpenWebUI instead of direct Ollama API / still leave ollama = True useOpenWebUI = False openWebUIURL = http://localhost:3000 # OpenWebUI API key/token (required when useOpenWebUI is True) openWebUIAPIKey = # Ollama model to use (defaults to gemma3:270m) gemma2 is good for older SYSTEM prompt # ollamaModel is used for both Ollama and OpenWebUI when useOpenWebUI its just the model name # ollamaModel = gemma3:latest # ollamaModel = gemma2:2b # if True, the query is sent raw to the LLM, if False uses internal SYSTEM prompt rawLLMQuery = True # If False, the LLM only replies to the "ask:" and "askai" commands. otherwise DM's automatically go to LLM llmReplyToNonCommands = True # Enable Wikipedia/Kiwix integration with LLM for RAG (Retrieval Augmented Generation) # When enabled, LLM will automatically search Wikipedia/Kiwix and include context in responses llmUseWikiContext = False # StoreForward Enabled and Limits StoreForward = True StoreLimit = 3 reverseSF = False # history command enableCmdHistory = True # command history ignore list ex: 2813308004,4258675309 lheardCmdIgnoreNodes = # 24 hour clock zuluTime = False # wait time for URL requests urlTimeout = 15 # logging to file of the non Bot messages LogMessagesToFile = False # Logging of system messages to file SyslogToFile = True # logging level for the bot (DEBUG, INFO, WARNING, ERROR, CRITICAL) sysloglevel = DEBUG # Number of log files to keep in days, 0 to keep all log_backup_count = 32 #Do not retry enabling interface if it fails, just exit to let OS restart the bot dont_retry_disconnect = False #echo command, will echo back your message as the bot enableEcho = False # command will only echo 1:1 if sent on this channel, otherwise it will prepend @yourname echoChannel = 9 [emergencyHandler] # enable or disable the emergency response handler enabled = False # channel to send a message to when the emergency handler is triggered alert_channel = 2 alert_interface = 1 [sentry] # detect anyone close to the bot SentryEnabled = True # device interface and channel to send the alert message to SentryInterface = 1 SentryChannel = 2 emailSentryAlerts = False # Enable detection sensor alert, requires external GPIO sensor connected to node detectionSensorAlert = False # list of ignored nodes numbers ex: 2813308004,4258675309 sentryIgnoreList = # list of watched nodes numbers ex: 2813308004,4258675309 sentryWatchList = # radius in meters to detect someone close to the bot SentryRadius = 100 # holdoff time multiplied by seconds(20) of the watchdog SentryHoldoff = 9 # Enable running external shell command when sentry alert is triggered cmdShellSentryAlerts = False # External shell command to run when sentry alert is triggered sentryAlertNear = sentry_alert_near.sh sentryAlertAway = sentry_alert_away.sh # HighFlying Node alert highFlyingAlert = True # Altitude in meters to trigger the alert highFlyingAlertAltitude = 2000 # check with OpenSkyNetwork if highfly detected for aircraft highflyOpenskynetwork = True # Channel to send Alert when the high flying node is detected highFlyingAlertInterface = 1 # to disable OTA alert set to unused channel like 9 highFlyingAlertChannel = 2 # list of nodes numbers to ignore high flying alert ex: 2813308004,4258675309 highFlyingIgnoreList = [bbs] enabled = True # list of banned nodes numbers ex: 2813308004,4258675309 bbs_ban_list = # list of admin nodes numbers ex: 2813308004,4258675309 bbs_admin_list = # enable bbs synchronization with other nodes bbslink_enabled = False # list of whitelisted nodes numbers ex: 2813308004,4258675309 empty list allows all bbslink_whitelist = # enable API script access (increases disk i/o) bbsAPI_enabled = False # location module [location] enabled = True lat = 48.50 lon = -123.0 fuzzConfigLocation = True fuzzItAll = False # database file for saved locations locations_db = data/locations.db # if True, only administrators can save public locations public_location_admin_manage = False # if True, only administrators can delete locations delete_public_locations_admins_only = False # Default to metric units rather than imperial useMetric = False # repeaterList lookup location (rbook / artsci / False) repeaterLookup = rbook # Satalite Pass Prediction # Register for free API https://www.n2yo.com/login/ personal data page at bottom 'Are you developer?' n2yoAPIKey = # NORAD list https://www.n2yo.com/satellites/ satList = 25544,7530 # use Open-Meteo API for weather data not NOAA useful for non US locations UseMeteoWxAPI = False # NOAA weather forecast days NOAAforecastDuration = 3 # number of weather alerts to display NOAAalertCount = 2 # NOAA Weather EAS Alert Broadcast wxAlertBroadcastEnabled = False # Enable Ignore any message that includes following word list ignoreEASenable = False ignoreEASwords = test,advisory # Add extra location to the weather alert enableExtraLocationWx = False # NOAA Coastal Data Enable NOAA Coastal Waters Forecasts and Tide coastalEnabled = False # Find the correct costal weather directory at https://tgftp.nws.noaa.gov/data/forecasts/marine/coastal/ # pz = Puget Sound, ph = Honolulu HI, gm = Florida Keys, pk = Alaska # this map can help https://www.weather.gov/marine select location and then look at the 'Forecast-by-Zone Map' # myCoastalZone is the .txt file with the forecast data myCoastalZone = https://tgftp.nws.noaa.gov/data/forecasts/marine/coastal/pz/pzz135.txt # number of data points to return, default is 3 coastalForecastDays = 3 # NOAA USGS Hydrology river identifiers, LID or USGS ID https://waterdata.usgs.gov 12484500 Columbia River at The Dalles, OR # for multiple rivers use comma separated list e.g. 12484500,14105700 riverList = # USA FEMA IPAWS alerts ipawsAlertEnabled = True # comma separated list of FIPS codes to trigger local alert. find your FIPS codes at https://en.wikipedia.org/wiki/Federal_Information_Processing_Standard_state_code myFIPSList = 57,58,53 # find your SAME https://www.weather.gov/nwr/counties comma separated list of SAME code to further refine local alert. mySAMEList = 053029,053073 # Enable Ignore, headline that includes following word list ignoreFEMAenable = True ignoreFEMAwords = test,exercise # USGS Volcano alerts Enable USGS Volcano Alert Broadcast volcanoAlertBroadcastEnabled = False # Enable Ignore any message that includes following word list ignoreUSGSEnable = False ignoreUSGSWords = test,advisory # Use Germany/DE Alert Broadcast Data enableDEalerts = False # comma separated list of regional codes trigger local alert. # find your regional codet at https://www.xrepository.de/api/xrepository/urn:de:bund:destatis:bevoelkerungsstatistik:schluessel:rs_2021-07-31/download/Regionalschl_ssel_2021-07-31.json myRegionalKeysDE = 110000000000,120510000000 # Alerts are sent to the emergency_handler interface and channel duplicate messages are send here if set eAlertBroadcastCh = # CheckList Checkin/Checkout [checklist] enabled = False checklist_db = data/checklist.db reverse_in_out = False # Auto approve new checklists auto_approve = True # Check-in reminder interval is 5min # Checkin broadcast interface and channel is emergency_handler interface and channel # Inventory and Point of Sale System [inventory] enabled = False inventory_db = data/inventory.db # Set to True to disable penny precision and round to nickels (USA cash sales) # When True: cash sales round down, taxed sales round up to nearest $0.05 # When False (default): normal penny precision ($0.01) disable_penny = False [qrz] # QRZ Hello to new nodes with message enabled = False qrz_db = data/qrz.db qrz_hello_string = "MeshBot says Hello! DM for more info." # Training mode will not send the hello message to new nodes training = True # repeater module [repeater] enabled = False # list of repeater channels ex: 2,3 which will be consumed # and rebroadcasted on the same channel on the other device/node/interface # with great power comes great responsibility, danger could be lurking in use of this feature # if you have the two nodes on the same radio configurations, you could create a feedback loop repeater_channels = [scheduler] # enable or disable the scheduler module enabled = False # interface to send the message to interface = 1 # channel to send the message to channel = 2 message = "MeshBot says Hello! DM for more info." # enable overides the above and uses the motd as the message schedulerMotd = False # value can be min,hour,day,mon,tue,wed,thu,fri,sat,sun. # value can also be 'joke' (min/interval), 'weather' (time/day), 'link' (hour/interval) for special auto messages # or 'news' (hour/interval), 'readrss' (hour/interval), 'mwx' (time/day), 'sysinfo' (hour/interval), # 'tide' (time/day), 'solar' (time/day) for automated information broadcasts, matching module needs enabled! # 'custom' for module/scheduler.py custom schedule examples value = # interval to use when time is not set (e.g. every 2 days) interval = # time of day in 24:00 hour format when value is 'day' and interval is not set # Process run :00,:20,:40 try and vary the 20 minute offsets to avoid collision time = [radioMon] # dx cluster `dx` command dxspotter_enabled = True # alerts in this module use the following interface and channel sigWatchBroadcastInterface = 1 # broadcast channel can also be a comma separated list of channels sigWatchBroadcastCh = 2 # using Hamlib rig control will monitor and alert on channel use enabled = False rigControlServerAddress = 127.0.0.1:4532 # minimum SNR as reported by radio via hamlib signalDetectionThreshold = -10 # hold time for high SNR signalHoldTime = 10 # the following are combined to reset the monitor signalCooldown = 5 signalCycleLimit = 5 # Enable VOX detection using default input voxDetectionEnabled = False # description to use in the alert message voxDescription = VOX useLocalVoxModel = False # default language for VOX detection voxLanguage = en-us # sound.card input device to use for VOX detection, 'default' uses system default voxInputDevice = default # "hey chirpy" voxOnTrapList = True voxTrapList = chirpy # allow use of 'weather' and 'joke' commands via VOX voxEnableCmd = True # Meshages Text-to-Speech (TTS) for incoming messages and DM meshagesTTS = False ttsChannels = 2 # WSJT-X UDP monitoring - listens for decode messages from WSJT-X, FT8/FT4/WSPR etc. wsjtxDetectionEnabled = False # UDP address and port where WSJT-X broadcasts (default: 127.0.0.1:2237) wsjtxUdpServerAddress = 127.0.0.1:2237 # Comma-separated list of callsigns to watch (empty = all callsigns) wsjtxWatchedCallsigns = # JS8Call TCP monitoring - connects to JS8Call API for message forwarding js8callDetectionEnabled = False # TCP address and port where JS8Call API listens (default: 127.0.0.1:2442) js8callServerAddress = 127.0.0.1:2442 # Comma-separated list of callsigns to watch (empty = all callsigns) js8callWatchedCallsigns = [fileMon] filemon_enabled = False # text file to monitor for changes file_path = alert.txt # channel to send the message to can be 2,3 multiple channels comma separated broadcastCh = 2 # news command will return the contents of a text file enable_read_news = False news_file_path = ../data/news.txt # only return a single random (head)line from the news file news_random_line = False # only return random news 'block' (seprated by two newlines) randomly (precidence over news_random_line) news_block_mode = True # enable the use of exernal shell commands, this enables some data in `sysinfo` enable_runShellCmd = False # if runShellCmd and you think it is safe to allow the x: command to run # direct shell command handler the x: command in DMs allowXcmd = False # Enable 2 factor authentication for x: commands twoFactor_enabled = True # time in seconds to wait for the correct 2FA answer twoFactor_timeout = 100 [smtp] # enable or disable the SMTP module enableSMTP = False # enable or disable the IMAP module for inbound email enableImap = False # list of Sysop Emails seperate with commas sysopEmails = SMTP_SERVER = smtp.gmail.com # 587 SMTP over TLS/STARTTLS, 25 legacy SMTP, 465 SMTP over SSL SMTP_PORT = 587 # Sender email: be mindful of public access, don't use your personal email FROM_EMAIL = none@gmail.com SMTP_AUTH = True SMTP_USERNAME = none@gmail.com SMTP_PASSWORD = none EMAIL_SUBJECT = Meshtastic✉️ # IMAP not implimented yet IMAP_SERVER = imap.gmail.com # 993 IMAP over TLS/SSL, 143 legacy IMAP IMAP_PORT = 993 # IMAP login usually same as SMTP IMAP_USERNAME = none@gmail.com IMAP_PASSWORD = none IMAP_FOLDER = inbox [games] # if hop limit for the user exceeds this value, the message will be dropped game_hop_limit = 5 disable_emojis = False # enable or disable the games module(s) dopeWars = True lemonade = True blackjack = True videopoker = True mastermind = True golfsim = True hangman = True hamtest = True tictactoe = True wordOfTheDay = True battleShip = True # enable or disable the quiz game module questions are in data/quiz.json quiz = False # enable or disable the survey game module questions are in data/survey/*_survey.json survey = False # this is the default survey to use when command givcen, from data/survey/example_survey.json defaultSurvey = example # Whether to record user ID in responses surveyRecordID=True # Whether to record location on start of survey surveyRecordLocation=True [messagingSettings] # delay in seconds for response to avoid message collision /throttling responseDelay = 2.2 # delay in seconds for splits in messages to avoid message collision /throttling splitDelay = 2.5 # message chunk size in charcters, chunkr allows exceeding by 3 characters MESSAGE_CHUNK_SIZE = 160 # Request Acknowledgement of message OTA wantAck = False # Max limit buffer for radio testing in bytes maxBuffer = 200 #Enable Extra logging of Hop count data enableHopLogs = False # Noisy Node Telemetry Logging and packet threshold noisyNodeLogging = False noisyTelemetryLimit = 5 logMetaStats = True # Enable detailed packet logging all packets DEBUGpacket = False # metaPacket detailed logging, the filter negates the port ID debugMetadata = False metadataFilter = TELEMETRY_APP,POSITION_APP # Enable or disable automatic banning of nodes autoBanEnabled = False # Number of offenses before auto-ban autoBanThreshold = 5 # Throttle value for API requests no ban_hammer apiThrottleValue = 20 # Timeframe for offenses (in seconds) autoBanTimeframe = 3600 [dataPersistence] # Enable or disable the data persistence loop service enabled = True # Interval in seconds for the persistence loop (how often to save data) interval = 300