"""Constants for TaskMate integration.""" from typing import Final DOMAIN: Final = "taskmate" # Configuration keys CONF_CHILDREN: Final = "children" CONF_CHORES: Final = "chores" CONF_REWARDS: Final = "rewards" CONF_POINTS_NAME: Final = "points_name" CONF_POINTS_ICON: Final = "points_icon" # Child keys CONF_CHILD_NAME: Final = "name" CONF_CHILD_AVATAR: Final = "avatar" CONF_CHILD_POINTS: Final = "points" CONF_CHILD_ID: Final = "id" CONF_CHILD_AVAILABILITY_ENTITY: Final = "availability_entity" # Chore keys CONF_CHORE_NAME: Final = "name" CONF_CHORE_DESCRIPTION: Final = "description" CONF_CHORE_POINTS: Final = "points" CONF_CHORE_DUE_DAYS: Final = "due_days" CONF_CHORE_ASSIGNED_TO: Final = "assigned_to" CONF_CHORE_ID: Final = "id" CONF_CHORE_REQUIRES_APPROVAL: Final = "requires_approval" CONF_CLAIM_ALLOWANCE_MINUTES: Final = "claim_allowance_minutes" DEFAULT_CLAIM_ALLOWANCE_MINUTES: Final = 0 CONF_CHORE_ASSIGNMENT_MODE: Final = "assignment_mode" CONF_CHORE_ASSIGNMENT_ROTATION_ANCHOR: Final = "assignment_rotation_anchor" CONF_CHORE_PUBLISH_CALENDARS: Final = "publish_calendar_entities" CONF_CHORE_REQUIRE_AVAILABILITY: Final = "require_availability" CONF_CHORE_MANUAL_START_CHILD: Final = "manual_start_child_id" # Task groups CONF_TASK_GROUPS: Final = "task_groups" CONF_TASK_GROUP_ID: Final = "group_id" CONF_TASK_GROUP_NAME: Final = "name" CONF_TASK_GROUP_POLICY: Final = "policy" CONF_TASK_GROUP_CHORE_IDS: Final = "chore_ids" TASK_GROUP_POLICIES: Final = ["sticky", "spread"] DEFAULT_TASK_GROUP_POLICY: Final = "sticky" # Calendar projection: how many days ahead each chore's assignment is pushed # into the configured HA calendars. 14 days balances planning visibility with # calendar noise; raise via the Settings flow for longer planning horizons. CONF_CALENDAR_PROJECTION_DAYS: Final = "calendar_projection_days" DEFAULT_CALENDAR_PROJECTION_DAYS: Final = 14 MIN_CALENDAR_PROJECTION_DAYS: Final = 1 MAX_CALENDAR_PROJECTION_DAYS: Final = 90 # Assignment modes # "everyone" = visible to every child in assigned_to (or all children if empty) -- existing behavior # "alternating" = round-robin through assigned_to (or all children), one child per calendar day # "random" = deterministic per-day random pick from the same pool (each chore picks independently) # "balanced" = split today's balanced-mode chores evenly across the pool so no one child gets swamped # "first_come" = competitive: shown to the whole pool at once; first child to complete it wins and it # hides for everyone else (shared quota of 1). A parent rejection reopens it for the pool. ASSIGNMENT_MODES: Final = ["everyone", "alternating", "random", "balanced", "first_come", "unassigned"] DEFAULT_ASSIGNMENT_MODE: Final = "everyone" # Reward keys CONF_REWARD_NAME: Final = "name" CONF_REWARD_DESCRIPTION: Final = "description" CONF_REWARD_COST: Final = "cost" CONF_REWARD_ICON: Final = "icon" CONF_REWARD_ID: Final = "id" CONF_REWARD_QUANTITY: Final = "quantity" CONF_REWARD_EXPIRES_AT: Final = "expires_at" # Default values DEFAULT_POINTS_NAME: Final = "Stars" DEFAULT_POINTS_ICON: Final = "mdi:star" # Days of week DAYS_OF_WEEK: Final = [ "monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday", ] # Recurrence options for chores (Mode B) RECURRENCE_OPTIONS: Final = [ "every_2_days", "weekly", "every_2_weeks", "monthly", "every_3_months", "every_6_months", ] RECURRENCE_LABELS: Final = { "every_2_days": "Every 2 days", "weekly": "Weekly", "every_2_weeks": "Every 2 weeks", "monthly": "Monthly", "every_3_months": "Every 3 months", "every_6_months": "Every 6 months", } # Schedule modes SCHEDULE_MODES: Final = ["specific_days", "recurring", "one_shot"] # First occurrence modes FIRST_OCCURRENCE_MODES: Final = ["available_immediately", "wait_for_first_occurrence"] # Time categories for chores TIME_CATEGORIES: Final = [ "morning", "afternoon", "evening", "night", "anytime", ] # Time category icons TIME_CATEGORY_ICONS: Final = { "morning": "mdi:weather-sunny", "afternoon": "mdi:white-balance-sunny", "evening": "mdi:weather-sunset", "night": "mdi:weather-night", "anytime": "mdi:clock-outline", } # Default user-editable time-of-day periods. "anytime" is implicit (all-day, # always available) and never appears in this list. An empty label means # "use the translated built-in name for this id". DEFAULT_TIME_PERIODS: Final = [ {"id": "morning", "label": "", "start": "06:00", "end": "12:00", "icon": "mdi:weather-sunny"}, {"id": "afternoon", "label": "", "start": "12:00", "end": "17:00", "icon": "mdi:white-balance-sunny"}, {"id": "evening", "label": "", "start": "17:00", "end": "21:00", "icon": "mdi:weather-sunset"}, {"id": "night", "label": "", "start": "21:00", "end": "23:59", "icon": "mdi:weather-night"}, ] MAX_TIME_PERIODS: Final = 24 # Avatar options AVATAR_OPTIONS: Final = [ # Basic faces "mdi:account-circle", "mdi:face-man", "mdi:face-woman", "mdi:face-man-outline", "mdi:face-woman-outline", # Fun character avatars "mdi:robot-happy", "mdi:robot-excited", "mdi:alien", "mdi:ninja", "mdi:pirate", # Animals kids love "mdi:cat", "mdi:dog", "mdi:unicorn", "mdi:dragon", "mdi:owl", "mdi:penguin", "mdi:panda", "mdi:rabbit", "mdi:koala", "mdi:fox", "mdi:dolphin", "mdi:jellyfish", "mdi:octopus", "mdi:butterfly", # Splatoon Inkling-inspired (colorful, action-themed) "mdi:palette", "mdi:spray", "mdi:water-outline", "mdi:shimmer", "mdi:flare", "mdi:star-face", "mdi:emoticon-cool", "mdi:emoticon-excited", "mdi:emoticon-kiss", "mdi:emoticon-wink", "mdi:emoticon-happy", "mdi:emoticon-poop", "mdi:face-woman-shimmer", "mdi:face-man-shimmer", "mdi:account-star", "mdi:account-heart", # Gaming and action themed "mdi:gamepad-variant", "mdi:controller", "mdi:trophy", "mdi:crown", "mdi:lightning-bolt", "mdi:fire", "mdi:rocket", "mdi:sword", "mdi:shield", # Space and fantasy "mdi:alien-outline", "mdi:ufo", "mdi:space-invaders", "mdi:ghost", "mdi:skull-crossbones", "mdi:wizard-hat", "mdi:magic-staff", # Nature and colorful "mdi:flower-tulip", "mdi:flower-poppy", "mdi:clover", "mdi:mushroom", "mdi:star-shooting", "mdi:star-four-points", "mdi:heart", "mdi:heart-multiple", "mdi:diamond-stone", "mdi:puzzle-heart", ] # Reward icon options REWARD_ICON_OPTIONS: Final = [ "mdi:gift", "mdi:ice-cream", "mdi:pizza", "mdi:movie", "mdi:gamepad-variant", "mdi:tablet", "mdi:television", "mdi:bike", "mdi:currency-usd", "mdi:shopping", "mdi:party-popper", "mdi:swim", "mdi:sleep", "mdi:candy", ] # Platforms PLATFORMS: Final = ["sensor", "button", "binary_sensor"] # Services SERVICE_COMPLETE_CHORE: Final = "complete_chore" SERVICE_APPROVE_CHORE: Final = "approve_chore" SERVICE_APPROVE_ALL_CHORES: Final = "approve_all_chores" SERVICE_REJECT_CHORE: Final = "reject_chore" SERVICE_UNDO_CHORE_APPROVAL: Final = "undo_chore_approval" SERVICE_APPLY_MANDATORY_PENALTY: Final = "apply_mandatory_penalty" SERVICE_POSTPONE_MANDATORY_CHORE: Final = "postpone_mandatory_chore" SERVICE_DISMISS_MANDATORY_CHORE: Final = "dismiss_mandatory_chore" SERVICE_CLAIM_REWARD: Final = "claim_reward" SERVICE_APPROVE_REWARD: Final = "approve_reward" SERVICE_REJECT_REWARD: Final = "reject_reward" SERVICE_ADD_POINTS: Final = "add_points" SERVICE_REMOVE_POINTS: Final = "remove_points" SERVICE_UNDO_TRANSACTION: Final = "undo_transaction" SERVICE_TEST_NOTIFICATION: Final = "test_notification" SERVICE_GIFT_POINTS: Final = "gift_points" SERVICE_RECORD_ALLOWANCE_PAYOUT: Final = "record_allowance_payout" SERVICE_REQUEST_SWAP: Final = "request_swap" SERVICE_CHOOSE_AVATAR: Final = "choose_avatar" SERVICE_SET_CHORE_ORDER: Final = "set_chore_order" SERVICE_PREVIEW_SOUND: Final = "preview_sound" SERVICE_ADD_PENALTY: Final = "add_penalty" SERVICE_UPDATE_PENALTY: Final = "update_penalty" SERVICE_REMOVE_PENALTY: Final = "remove_penalty" SERVICE_APPLY_PENALTY: Final = "apply_penalty" SERVICE_ADD_BONUS: Final = "add_bonus" SERVICE_UPDATE_BONUS: Final = "update_bonus" SERVICE_REMOVE_BONUS: Final = "remove_bonus" SERVICE_APPLY_BONUS: Final = "apply_bonus" SERVICE_ADD_CHORE: Final = "add_chore" SERVICE_ALLOCATE_POINTS_TO_POOL: Final = "allocate_points_to_pool" SERVICE_SKIP_CHORE: Final = "skip_chore" SERVICE_SET_CHORE_MANUAL_START: Final = "set_chore_manual_start" SERVICE_ADD_TASK_GROUP: Final = "add_task_group" SERVICE_UPDATE_TASK_GROUP: Final = "update_task_group" SERVICE_REMOVE_TASK_GROUP: Final = "remove_task_group" SERVICE_COMPLETE_BONUS_SUBTASK: Final = "complete_bonus_subtask" SERVICE_START_TIMED_TASK: Final = "start_timed_task" SERVICE_PAUSE_TIMED_TASK: Final = "pause_timed_task" SERVICE_STOP_TIMED_TASK: Final = "stop_timed_task" # Events EVENT_PREVIEW_SOUND: Final = "taskmate_preview_sound" # Attributes ATTR_CHILD_ID: Final = "child_id" ATTR_CHORE_ID: Final = "chore_id" ATTR_AS_PARENT: Final = "as_parent" ATTR_REWARD_ID: Final = "reward_id" ATTR_POINTS: Final = "points" ATTR_REASON: Final = "reason" ATTR_CHORE_ORDER: Final = "chore_order" ATTR_SOUND: Final = "sound" ATTR_PENALTY_ID: Final = "penalty_id" ATTR_PENALTY_NAME: Final = "name" ATTR_PENALTY_POINTS: Final = "points" ATTR_PENALTY_DESCRIPTION: Final = "description" ATTR_PENALTY_ICON: Final = "icon" ATTR_PENALTY_ASSIGNED_TO: Final = "assigned_to" ATTR_BONUS_ID: Final = "bonus_id" ATTR_BONUS_NAME: Final = "name" ATTR_BONUS_POINTS: Final = "points" ATTR_BONUS_DESCRIPTION: Final = "description" ATTR_BONUS_ICON: Final = "icon" ATTR_BONUS_ASSIGNED_TO: Final = "assigned_to" ATTR_CHORE_NAME: Final = "name" ATTR_CHORE_DESCRIPTION: Final = "description" ATTR_CHORE_POINTS: Final = "points" ATTR_CHORE_ASSIGNED_TO: Final = "assigned_to" ATTR_CHORE_TIME_CATEGORY: Final = "time_category" ATTR_CHORE_ONE_SHOT: Final = "one_shot" ATTR_CHORE_REQUIRES_APPROVAL: Final = "requires_approval" ATTR_BONUS_SUBTASK_ID: Final = "bonus_subtask_id" # Badge attributes ATTR_BADGE_ID: Final = "badge_id" ATTR_BADGE_NAME: Final = "name" ATTR_BADGE_DESCRIPTION: Final = "description" ATTR_BADGE_ICON: Final = "icon" ATTR_BADGE_TIER: Final = "tier" ATTR_BADGE_POINT_BONUS: Final = "point_bonus" ATTR_BADGE_CRITERIA: Final = "criteria" ATTR_BADGE_COMBINATOR: Final = "combinator" ATTR_BADGE_ASSIGNED_TO: Final = "assigned_to" ATTR_BADGE_NOTIFY_ON_EARN: Final = "notify_on_earn" ATTR_BADGE_ENABLED: Final = "enabled" ATTR_AWARDED_BADGE_ID: Final = "awarded_badge_id" # States STATE_PENDING: Final = "pending" STATE_AWAITING_APPROVAL: Final = "awaiting_approval" STATE_COMPLETED: Final = "completed" STATE_CLAIMED: Final = "claimed" # Completion sound options # Most sounds are synthesized via Web Audio API # Fart sounds are CC0 audio files from BigSoundBank.com and GfxSounds.com COMPLETION_SOUND_OPTIONS: Final = [ "none", # No sound "coin", # Coin collect sound "levelup", # Level up / success sound "fanfare", # Celebratory fanfare "chime", # Simple chime "powerup", # Power up sound "undo", # Sad/descending "womp womp" for undo actions "fart1", # Flatulence 1 (short) "fart2", # Flatulence 2 (short) "fart3", # Flatulence 3 (short) "fart4", # Pony flatulence 2 (~3 sec) "fart5", # Flatulence 4 - discreet (short) "fart6", # Prout'cochons 1 - pig game sound (short) "fart7", # Prout'cochons 2 - pig game sound (short) "fart8", # Prout'cochons 3 - pig game sound (short) "fart9", # Pony flatulence 1 (short) "fart10", # Baby fart (short) "fart_random", # Random fart - picks a random fart sound each time! ] # Default completion sound DEFAULT_COMPLETION_SOUND: Final = "coin" # Chore keys (sound-related) CONF_CHORE_COMPLETION_SOUND: Final = "completion_sound" # --- Chore difficulty tiers --- # Each chore carries a difficulty tier; the points it awards are the base # points multiplied by the tier's multiplier. "medium" is the neutral baseline # (×1.0) so chores that predate this feature (which default to medium) keep # their exact award value. Multipliers are configurable via the settings # "difficulty_multiplier_" keys. DIFFICULTY_TIERS: Final = ("easy", "medium", "hard") DEFAULT_DIFFICULTY: Final = "medium" DEFAULT_DIFFICULTY_MULTIPLIERS: Final = {"easy": 0.5, "medium": 1.0, "hard": 2.0} # --- Notification type IDs (v3.9.0) --- NOTIF_TYPE_BEDTIME_REMINDER: Final = "bedtime_reminder" NOTIF_TYPE_STREAK_AT_RISK: Final = "streak_at_risk" NOTIF_TYPE_ALL_CHORES_DONE: Final = "all_chores_done" NOTIF_TYPE_BADGE_EARNED: Final = "badge_earned" NOTIF_TYPE_PENDING_CHORE_APPROVAL: Final = "pending_chore_approval" NOTIF_TYPE_PENDING_REWARD_CLAIM: Final = "pending_reward_claim" NOTIF_TYPE_STREAK_MILESTONE: Final = "streak_milestone" NOTIF_TYPE_LEVEL_UP: Final = "level_up" NOTIF_TYPE_WEEKLY_DIGEST: Final = "weekly_digest" NOTIF_TYPE_CELEBRATION: Final = "celebration" NOTIF_TYPE_MANDATORY_REMINDER: Final = "mandatory_reminder" NOTIF_TYPE_MANDATORY_PARENT_ALERT: Final = "mandatory_parent_alert" NOTIF_TYPE_MONTHLY_REPORT: Final = "monthly_report" NOTIF_TYPE_SEASON_CHAMPION: Final = "season_champion" NOTIF_TYPE_FAMILY_GOAL_REACHED: Final = "family_goal_reached"