# chores configuration template.
#
# Copy this to the container host as (for example)
# /opt/smart-home/chores/chores.env, fill in real values, and chmod 600 it.
# Works with NOTHING filled in below except the identity/ntfy bits — the camera
# checks, calendar busy-check, and trash-day-eve check each individually no-op if
# left unconfigured.

# ---------------------------------------------------------------------------
# identity — required for nudging (who's home, who's near which room, who was
# recently seen by a camera, and who's assigned which chore). Same token identity
# itself uses.
#
# NOTE: this was `http://127.0.0.1:8097` and could never have worked — inside the
# chores container that address is the chores container itself. Since _presence()
# fails soft (logs, returns an empty list, waits for the next run), the symptom would
# have been nudging that simply never happened, with no error anywhere obvious.
# identity is an ordinary service on the same compose bridge network, so its
# container name resolves via Docker's DNS.
# ---------------------------------------------------------------------------
IDENTITY_URL=http://identity:8097
IDENTITY_TOKEN=

# ---------------------------------------------------------------------------
# Trash-day-eve — same feed trash-calendar reads, this script only ever reads it
# too (never writes to the calendar). Leave blank to skip this check entirely.
# ---------------------------------------------------------------------------
WASTE_ICS_URL=

# ---------------------------------------------------------------------------
# Household calendar busy-check (optional) — SAME CALDAV_* credentials as
# digest-engine's ingest/caldav.py and trash-calendar, reused for a third,
# independent READ (never a write here either). If set, a currently-active
# calendar event whose summary contains one of CALDAV_QUIET_KEYWORDS pauses
# nudging for that run — see README.md's honest limitation (this is household-
# wide, not per-person; it can't tell only one person is busy).
# ---------------------------------------------------------------------------
CALDAV_URL=
CALDAV_USERNAME=
CALDAV_PASSWORD=
CALDAV_VERIFY_TLS=true
CALDAV_QUIET_KEYWORDS=busy,meeting,call,movie,sleep

# ---------------------------------------------------------------------------
# Camera checks — OFF until both FRIGATE_URL and CAMERA_WATCHPOINTS are set. No
# camera hardware has been chosen yet (docs/project-plan.md §1.18) — leave this
# blank until Tapo pan/tilt cameras are actually deployed as Frigate camera
# sources.
#
# CAMERA_WATCHPOINTS format: "type:frigate_camera_name[:ptz_preset_name],...".
# type must be one of:
#   bin_full                — is the bin full
#   dishes                  — is the sink/counter dirty
#   litter                  — has someone left trash out somewhere it doesn't belong
#   groceries_out_of_place  — is there food still standing out that belongs in a
#                             fridge/freezer/cupboard
# The last two are told to whoever the camera most recently recognized nearby, not
# just whoever's home in general, and neither can be assigned or exempted away —
# see README.md. groceries_out_of_place also has a much shorter neglect fuse than
# everything else (below), because the failure mode is spoiled food, not untidiness.
# preset is optional — omit it if the camera doesn't need to move. Example:
#   CAMERA_WATCHPOINTS=bin_full:driveway_cam:trash_preset,dishes:kitchen_cam,litter:hallway_cam,groceries_out_of_place:kitchen_cam
# ---------------------------------------------------------------------------
FRIGATE_URL=
CAMERA_WATCHPOINTS=

# How long groceries may stand out before the nudge is redirected to somebody else,
# overriding NEGLECT_THRESHOLD_HOURS for that one chore type. 30 minutes by default:
# the default four hours is a sensible wait for a crisp packet and far too long for a
# tub of ice cream.
GROCERIES_NEGLECT_THRESHOLD_HOURS=0.5

# Same LLM host as digest-engine/pantry-vision. OLLAMA_VISION_MODEL must be a
# vision-capable model (see pantry-vision/README.md's identical caveat — plain text
# models cannot see images at all).
#
# OLLAMA_TEXT_MODEL is OPTIONAL and does something narrower than it sounds: it only
# PHRASES a reminder in a person's chore_reminder_style (set via identity's
# POST /people/<id>/chore-settings, see identity/README.md) — it never decides who
# gets nudged or when, that stays presence/calendar-driven, see check.py's module
# docstring. Leave blank (default) and every reminder just uses the plain template,
# same behavior as before this existed.
OLLAMA_HOST=http://llm-host:11434
OLLAMA_VISION_MODEL=llava
OLLAMA_TEXT_MODEL=

# ---------------------------------------------------------------------------
# Nudging — ntfy, already in the stack (ENABLE_NTFY in setup-container-host.sh).
# A single shared topic, not per-person — the notification text names who it's
# for, but everyone subscribed to this topic sees every nudge. Set up per-person
# topics/subscriptions yourself if that's not granular enough for your household.
#
# NEGLECT_THRESHOLD_HOURS: how long an open chore sits before the system tries
# redirecting the nudge to someone else who's around ("the next person that walks
# by") instead of re-nagging whoever was last nudged.
# ---------------------------------------------------------------------------
# NOTE: this was `http://127.0.0.1:8090` and could never have worked — inside the
# chores container, 127.0.0.1 is the chores container itself, not the host, so every
# nudge would have failed to send (silently: _notify() logs and moves on). ntfy is an
# ordinary service on the same compose bridge network, so its container name resolves
# via Docker's DNS, on its INTERNAL port 80 rather than the 8090 published to the LAN.
NTFY_URL=http://ntfy
NTFY_TOPIC=chores
NEGLECT_THRESHOLD_HOURS=4

# ---------------------------------------------------------------------------
# CHORE_ASSIGNMENT_STRICT: what an assignment (set in identity's admin panel)
# actually means when the assigned person isn't home.
#
#   false (default) — nudge whoever IS home instead. The house rule stays "I don't
#                     care who does it, as long as it gets done"; an absent assignee
#                     doesn't get to be the reason the bin stays full.
#   true            — wait for the assignee; nobody else is asked.
#
# Both are legitimate readings of "let me assign chores" — pick the one your
# household means. Either way, a chore assigned to nobody still falls through to the
# ordinary rotation, and litter ignores assignment entirely (see README.md).
# ---------------------------------------------------------------------------
CHORE_ASSIGNMENT_STRICT=false

CHORES_DB_PATH=/data/chores.db
LOG_LEVEL=INFO
