mirror of
https://github.com/legop3/MultiRoombaRover.git
synced 2026-09-15 17:12:59 -04:00
279 lines
9.9 KiB
YAML
279 lines
9.9 KiB
YAML
admins:
|
|
- username: admin
|
|
password_hash: "$2b$10$ZW4Jy7ctIt7k9V1AogFky.v4wedLF92t4/ZlT9kWPlIiCmdQNzJ.C" # password: adminpass
|
|
discord_id: "1234567890"
|
|
lockdown: false
|
|
- username: lockdown
|
|
password_hash: "$2b$10$n0L0oe1ZQy7IgM.FvVAzb.aXz43uaZWFiT0wr.05uNoVIDLawmrCG" # password: lockdownpass
|
|
discord_id: "0987654321"
|
|
lockdown: true
|
|
|
|
timezone: "America/New_York"
|
|
|
|
interInstance:
|
|
enabled: false
|
|
directoryUrls:
|
|
- "https://raw.githubusercontent.com/legop3/multi-roomba-rover-instance-directory/refs/heads/main/directory.json"
|
|
pollIntervalMs: 30000
|
|
requestTimeoutMs: 5000
|
|
profile:
|
|
publicUrl: "https://rover.example.com"
|
|
name: "Example Rover Server"
|
|
description: "A short public description of this rover server."
|
|
color: "#38bdf8"
|
|
|
|
llmCommentary:
|
|
enabled: false
|
|
model: "qwen2.5:7b-instruct"
|
|
ollamaServer: "http://127.0.0.1:11434"
|
|
frequency: 120000
|
|
|
|
overseerControl:
|
|
enabled: false
|
|
# autonomous runs the existing vote-gated loop forever; directAddress only
|
|
# runs one cycle when a chat message mentions the configured name.
|
|
mode: "autonomous"
|
|
observeOnly: true
|
|
postToolsOnlyMessages: false
|
|
tiebreakerEnable: false
|
|
runWhileNoPeopleOnline: false
|
|
name: "The Overseer"
|
|
model: "qwen2.5:7b-instruct"
|
|
ollamaServer: "http://127.0.0.1:11434"
|
|
profileImageUrl: "https://example.com/overseer.png"
|
|
gateIntervalMs: 2000
|
|
|
|
barcodeGames:
|
|
enabled: false
|
|
botName: "Barcode Games"
|
|
profileImageUrl: "https://example.com/barcode-games.png"
|
|
|
|
media:
|
|
# Base address for mediaMTX (scheme + host + optional port/path). The UI will always request
|
|
# http://<base>/<roverId>/whep
|
|
# Example: http://media-server.local:8889/video
|
|
whepBaseUrl: "http://media-server.local:8889/video"
|
|
# MediaMTX advertises these instance-specific DNS names or IP addresses as WebRTC ICE
|
|
# candidates. Include every public and LAN address browsers use to reach this server.
|
|
# The server generates MediaMTX's runtime configuration from this list; never edit a
|
|
# separate mediamtx.yml for a new installation.
|
|
additionalHosts:
|
|
- "rover.example.com"
|
|
- "media-server.local"
|
|
|
|
bandwidthSavings:
|
|
# Duplicate driver-tab handling for the same browser identity.
|
|
# allowed: no duplicate-tab protection
|
|
# verifiedOnly: verified/admin users may keep multiple driver tabs; unverified users may not
|
|
# notAllowed: every identity is limited to one driver tab
|
|
multiTabProtection: "verifiedOnly"
|
|
# Disconnect rover video when its player is outside the viewport or the web
|
|
# page is in a background browser tab. Rover audio is a separate stream and
|
|
# remains connected. /mini intentionally keeps its existing always-warm video
|
|
# behavior regardless of this option.
|
|
pauseHiddenRoverVideo: false
|
|
# Video for users who are attached to a source but do not currently own its
|
|
# active turn. "snapshots" saves upload bandwidth; "live" allows full video
|
|
# whenever the normal mode/visibility rules allow it.
|
|
nonTurnVideo:
|
|
mode: "snapshots"
|
|
# Snapshot mode activates only when controllable users exceed this number.
|
|
# A controllable user is attached to a rover or PTZ as operator/queue, not a
|
|
# plain spectator. 0 preserves always-on non-turn snapshots once anyone is
|
|
# actually attached to a controllable source.
|
|
userThreshold: 0
|
|
# Live video for spectators outside the local network. Local spectators are
|
|
# not restricted by this switch because LAN traffic is not the upload limit.
|
|
externalSpectatorVideo: "snapshots"
|
|
# Whether non-local users may enter the spectator page.
|
|
# off: block external spectators
|
|
# on: allow external spectators
|
|
# verifiedOnly: require a verified identity, but no separate spectator grant
|
|
# admin: require an identity feature-state grant at spectatorAccess.external
|
|
externalSpectatorAccess: "on"
|
|
|
|
audioForward:
|
|
enabled: true
|
|
ffmpegBin: "ffmpeg"
|
|
streamSuffix: "-fwd"
|
|
maxUploadBytes: 8388608
|
|
|
|
audioLevels:
|
|
# Base multipliers (0.0 - 4.0) applied before any approved user's signed
|
|
# personal adjustment. The server clamps every final rover gain to this same
|
|
# hard multiplier range.
|
|
hornGain: 1.0
|
|
ttsGain: 1.0
|
|
forwardGain: 1.0
|
|
# Approved users may move each personal slider this far below or above the
|
|
# base multiplier. Browser cookies store percentages, never raw multipliers.
|
|
maxPersonalAdjustmentPercent: 50
|
|
|
|
homeAssistant:
|
|
enabled: false
|
|
url: "http://homeassistant.local:8123"
|
|
token: "REPLACE_WITH_LONG_LIVED_TOKEN"
|
|
neato:
|
|
enabled: false
|
|
# ESPHome device name, used to derive gen3 entities:
|
|
# button.<device>_house_clean, button.<device>_send_to_base, button.<device>_locate_robot, etc.
|
|
device: "neato_vacuum"
|
|
lift:
|
|
enabled: false
|
|
# Two Home Assistant switches controlling lift direction.
|
|
# Raise sequence: down off -> wait interlockMs -> up on
|
|
# Lower sequence: up off -> wait interlockMs -> down on
|
|
upSwitch: "switch.lift_up"
|
|
downSwitch: "switch.lift_down"
|
|
interlockMs: 2000
|
|
commandCooldownMs: 3000
|
|
entities:
|
|
- id: "light.lab_main"
|
|
name: "Lab Lights"
|
|
- id: "switch.dock_power"
|
|
name: "Dock Power"
|
|
# type is optional; if omitted it is inferred from the entity id (light/switch)
|
|
# For room-light policy, all configured entities are treated as room lights (including switches).
|
|
buttons:
|
|
# Legacy action entities only (for example sensor.<button>_action from Zigbee2MQTT).
|
|
- entityId: "sensor.basement_rover_buttons_action"
|
|
# Human alert button
|
|
stateEquals: "on"
|
|
cooldownMs: 15000
|
|
action: "humanAlert"
|
|
- entityId: "sensor.basement_rover_buttons_action"
|
|
# Mode button: turns
|
|
stateEquals: "double"
|
|
cooldownMs: 2000
|
|
action: "modeTurns"
|
|
- entityId: "sensor.basement_rover_buttons_action"
|
|
# Mode button: admin
|
|
stateEquals: "hold"
|
|
cooldownMs: 2000
|
|
action: "modeAdmin"
|
|
- entityId: "sensor.basement_rover_buttons_action"
|
|
# Room lights lock toggle
|
|
stateEquals: "toggle"
|
|
cooldownMs: 1000
|
|
action: "lightsLockToggle"
|
|
|
|
roomCameras:
|
|
enabled: false
|
|
cameras:
|
|
- id: "lobby"
|
|
name: "Lobby Camera"
|
|
description: "Wide shot of the staging area."
|
|
url: "http://192.168.0.50/snapshot.jpg"
|
|
streamUrl: "http://192.168.0.50/stream.mjpg"
|
|
- id: "workshop"
|
|
name: "Workshop Bench"
|
|
description: "Shows the workbench and charging docks."
|
|
url: "http://192.168.0.51/snapshot.jpg"
|
|
streamUrl: "http://192.168.0.51/stream.mjpg"
|
|
|
|
ptzCamera:
|
|
enabled: false
|
|
name: "PTZ Camera"
|
|
host: "192.168.0.8"
|
|
onvifPort: 8000
|
|
username: "admin"
|
|
password: "REPLACE_WITH_CAMERA_PASSWORD"
|
|
# The Reolink TrackMix autotrack profile was token 003 during commissioning.
|
|
# Keeping this configurable lets firmware/profile resets be fixed without code
|
|
# changes while the integration still remains a single-camera feature.
|
|
profileToken: "003"
|
|
turnDurationMs: 300000
|
|
# PTZ replay capture needs a known-good replay encoder on the server. Keep it
|
|
# off by default so adding live PTZ does not start a broken replay worker loop.
|
|
replayEnabled: false
|
|
|
|
kinect:
|
|
enabled: false
|
|
# Capture requests are global across 3d/color so one person cannot spam room
|
|
# uploads for everyone else. This does not affect the native worker's local
|
|
# camera cache; it only gates browser-requested broadcasts.
|
|
captureCooldownMs: 10000
|
|
|
|
balanceBoard:
|
|
# The server installer always prepares Bluetooth and the kernel driver. This
|
|
# switch only starts the service and shows its small live-weight panel.
|
|
enabled: false
|
|
|
|
buttonBox:
|
|
enabled: false
|
|
|
|
barcodeScanner:
|
|
enabled: false
|
|
|
|
commands:
|
|
# Commands are a core server capability shared by site chat and optional
|
|
# transports. Their names therefore do not belong to Discord configuration.
|
|
prefix: "rs"
|
|
# Set this to null to disable the legacy bare time-status shortcut.
|
|
timeStatusCommand: "ts"
|
|
|
|
discord:
|
|
# Discord is optional. A token by itself never enables an external login.
|
|
enabled: false
|
|
token: "DISCORD_BOT_TOKEN"
|
|
guildId: "123456789012345678" # optional; bot works in any guild it's invited to
|
|
siteUrl: "https://rover.example.com"
|
|
channels:
|
|
general: "123456789012345678"
|
|
announcements: "123456789012345678"
|
|
adminAlerts: "123456789012345678"
|
|
# chat bridge is configured per guild via the shared `commands.prefix`
|
|
replay: "123456789012345678"
|
|
humanAlerts: "123456789012345678"
|
|
roles:
|
|
stalkerPing: "123456789012345678"
|
|
announcementPing: "123456789012345678"
|
|
adminPing: "123456789012345678"
|
|
humanAlertPing: "123456789012345678"
|
|
|
|
socials:
|
|
enabled: false
|
|
links:
|
|
- id: "discord"
|
|
label: "Discord"
|
|
url: "https://discord.gg/your-invite"
|
|
icon: "FaDiscord"
|
|
color: "#5865F2"
|
|
- id: "kofi"
|
|
label: "Ko-fi"
|
|
url: "https://ko-fi.com/your-handle"
|
|
icon: "FaCoffee"
|
|
color: "#29ABE0"
|
|
|
|
# Optional trusted HTML card shown at the bottom of the desktop driver page's
|
|
# left column. Leave html empty (or omit this section) to hide the card. This
|
|
# content is sent to driver browsers without sanitization, so only place markup
|
|
# here that is controlled by the server operator.
|
|
driverAd:
|
|
title: "Advertisement"
|
|
html: |
|
|
<a href="https://example.com" target="_blank" rel="noopener noreferrer">
|
|
<img src="https://example.com/ad.png" alt="Advertisement" style="display:block;width:100%;height:auto;">
|
|
</a>
|
|
|
|
# Optional passive fleet telemetry, history, and daily reporting. The collector
|
|
# observes existing server events and rover sensor frames but never participates
|
|
# in command, assignment, docking, or safety decisions.
|
|
fleetReports:
|
|
enabled: false
|
|
retention:
|
|
# Zero retains evidence indefinitely. Set explicit day counts on servers
|
|
# that prefer bounded storage over complete long-term history.
|
|
detailedDays: 0
|
|
minuteSamplesDays: 0
|
|
battery:
|
|
enabled: true
|
|
maximumIntegrationGapSeconds: 5
|
|
minimumCapacityTestDepthPercent: 60
|
|
discord:
|
|
enabled: true
|
|
sendAt: "08:00"
|
|
timezone: "America/New_York"
|
|
privacy:
|
|
retainChatBodies: true
|