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:////whep # Example: http://192.168.0.86:8889/video whepBaseUrl: "http://192.168.0.86:8889/video" 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" # 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: # Gains are multipliers (0.0 - 4.0) applied globally to all rovers. hornGain: 1.0 ttsGain: 1.0 forwardGain: 1.0 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._house_clean, button._send_to_base, button._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.