Per IMPLEMENTATION-ORDER.md 1.4: a quest_definition_windows table (definition_id, window, due_time) declares which day windows a definition spans, one row per definition+window via the composite primary key; window is CHECK-constrained to morning/afternoon/evening. - const.py: WINDOW_MORNING/AFTERNOON/EVENING, QUEST_WINDOWS canonical order, WINDOW_CLOCK_RANGES with the documented boundaries and the boundary-to-later-window rule documented for Feature 07. - schema.py: windows DDL joins SCHEMA_V1_STATEMENTS; due_time is caller-validated strict HH:MM (DAO layer), matching the date policy. - migrations.py: migration 4 is a plain CREATE IF NOT EXISTS statement list (no rebuild needed for a new table). - dao_rules.py: QuestDefinitionsDao gains upsert_window (idempotent per window, due_time refresh in place), list_windows (const order), remove_window; _validate_time/_validate_window helpers. - tests: windows DDL shape/constraints (CHECK matrix, duplicate, unknown definition), DAO round-trips, const range shapes; leak guards extended to the new table.
48 lines
1.5 KiB
Python
48 lines
1.5 KiB
Python
"""Constants for the NestQuest integration."""
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
DOMAIN = "nestquest"
|
|
LOGGER_NAME = "custom_components.nestquest"
|
|
LOGGER = logging.getLogger(LOGGER_NAME)
|
|
|
|
PLATFORMS: list[str] = []
|
|
|
|
SQLITE_DB_FILENAME = "nestquest.db"
|
|
|
|
# Configuration keys and default values
|
|
CONF_HORIZON_DAYS = "horizon_days"
|
|
DEFAULT_HORIZON_DAYS = 14
|
|
|
|
CONF_DAY_ROLLOVER_TIME = "day_rollover_time"
|
|
DEFAULT_DAY_ROLLOVER_TIME = "00:00"
|
|
|
|
CONF_PANEL_IDLE_TIMEOUT = "panel_idle_timeout"
|
|
DEFAULT_PANEL_IDLE_TIMEOUT = 300
|
|
|
|
# Quest windows (D-008): a definition may declare several day windows;
|
|
# each produces its own instance per day and groups the panel's Quest
|
|
# Log into three columns. The clock ranges are stored here so they stay
|
|
# configurable later. Boundaries: a window's end equals the next
|
|
# window's start; classification (Feature 07 materialisation) treats a
|
|
# due time exactly on the boundary as belonging to the LATER window, so
|
|
# 12:00 is afternoon (not morning) and 17:00 is evening (not
|
|
# afternoon). Times after 21:00 belong to no window.
|
|
WINDOW_MORNING = "morning"
|
|
WINDOW_AFTERNOON = "afternoon"
|
|
WINDOW_EVENING = "evening"
|
|
|
|
QUEST_WINDOWS: tuple[str, ...] = (
|
|
WINDOW_MORNING,
|
|
WINDOW_AFTERNOON,
|
|
WINDOW_EVENING,
|
|
)
|
|
|
|
#: Inclusive "HH:MM" bounds per window, in 24-hour local time.
|
|
WINDOW_CLOCK_RANGES: dict[str, tuple[str, str]] = {
|
|
WINDOW_MORNING: ("00:00", "11:59"),
|
|
WINDOW_AFTERNOON: ("12:00", "17:00"),
|
|
WINDOW_EVENING: ("17:00", "21:00"),
|
|
}
|