From 33be546b2364deccaac0f76246f46456f6af1f31 Mon Sep 17 00:00:00 2001 From: tempus2016 Date: Mon, 19 Oct 2026 20:29:40 +0000 Subject: [PATCH 1/2] feat: boost windows Time-boxed point multipliers on chosen chores and children. Start one on the spot from the admin panel's Today tab, set recurring rules in Settings, or call the new taskmate.start_boost / taskmate.end_boost services. Weekend/birthday interaction is the boost_stacking setting (highest wins by default, or stack). Child and kiosk cards show a full-screen takeover once per device per boost (show_boost_alert), and boosts can wake Fully Kiosk Browser tablets and Companion app devices. New events taskmate_boost_started/ended, opt-in boost_started push, overview boosts attribute, docs in wiki/Boost-Windows.md. --- README.md | 2 +- custom_components/taskmate/const.py | 2 + custom_components/taskmate/coord_boosts.py | 577 ++++++++++++++++++ custom_components/taskmate/coord_chores.py | 27 +- .../taskmate/coord_notifications.py | 5 + custom_components/taskmate/coord_points.py | 8 +- custom_components/taskmate/coordinator.py | 3 + custom_components/taskmate/event.py | 2 + custom_components/taskmate/family_services.py | 36 ++ custom_components/taskmate/models.py | 12 + custom_components/taskmate/notify_strings.py | 2 + custom_components/taskmate/sensor.py | 5 +- custom_components/taskmate/services.yaml | 66 ++ custom_components/taskmate/strings.json | 48 +- .../taskmate/translations/da.json | 48 +- .../taskmate/translations/de.json | 48 +- .../taskmate/translations/en-GB.json | 48 +- .../taskmate/translations/en.json | 48 +- .../taskmate/translations/fr.json | 48 +- .../taskmate/translations/nb.json | 48 +- .../taskmate/translations/nl.json | 48 +- .../taskmate/translations/nn.json | 48 +- .../taskmate/translations/pl.json | 48 +- .../taskmate/translations/pt-BR.json | 48 +- .../taskmate/translations/pt.json | 48 +- custom_components/taskmate/websocket.py | 16 + .../taskmate/websocket_boosts.py | 65 ++ .../taskmate/www/locales/da.json | 91 ++- .../taskmate/www/locales/de.json | 91 ++- .../taskmate/www/locales/en-GB.json | 91 ++- .../taskmate/www/locales/en.json | 91 ++- .../taskmate/www/locales/fr.json | 91 ++- .../taskmate/www/locales/nb.json | 91 ++- .../taskmate/www/locales/nl.json | 91 ++- .../taskmate/www/locales/nn.json | 91 ++- .../taskmate/www/locales/pl.json | 91 ++- .../taskmate/www/locales/pt-BR.json | 91 ++- .../taskmate/www/locales/pt.json | 91 ++- .../taskmate/www/taskmate-child-card.js | 160 ++++- .../taskmate/www/taskmate-design.js | 56 ++ .../taskmate/www/taskmate-kiosk-card.js | 115 +++- .../taskmate/www/taskmate-panel.js | 377 ++++++++++++ mkdocs.yml | 1 + tests/data/locale_english_baseline.json | 65 ++ tests/frontend/taskmate-boosts.test.cjs | 201 ++++++ tests/test_boosts.py | 405 ++++++++++++ wiki/Automations.md | 2 + wiki/Boost-Windows.md | 149 +++++ wiki/Dashboard-Cards.md | 3 + wiki/Event-Entities.md | 2 + wiki/Kiosk-Mode.md | 1 + wiki/Notifications.md | 1 + wiki/Sensor-Reference.md | 1 + wiki/Services.md | 20 + wiki/images/boost-child-card.png | Bin 0 -> 133977 bytes wiki/images/boost-dialog.png | Bin 0 -> 63686 bytes wiki/images/boost-kiosk.png | Bin 0 -> 185299 bytes wiki/index.md | 1 + 58 files changed, 3928 insertions(+), 37 deletions(-) create mode 100644 custom_components/taskmate/coord_boosts.py create mode 100644 custom_components/taskmate/websocket_boosts.py create mode 100644 tests/frontend/taskmate-boosts.test.cjs create mode 100644 tests/test_boosts.py create mode 100644 wiki/Boost-Windows.md create mode 100644 wiki/images/boost-child-card.png create mode 100644 wiki/images/boost-dialog.png create mode 100644 wiki/images/boost-kiosk.png diff --git a/README.md b/README.md index 38e38fef..8413e4dc 100755 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ For manual installation and the first-run walkthrough, see [Installation](https: **Chores** — flexible [scheduling](https://tempus2016.github.io/taskmate/Chore-Scheduling/) (specific days, recurring down to every N days, rotation, first-come), [difficulty tiers](https://tempus2016.github.io/taskmate/Difficulty-Tiers/), [dependencies](https://tempus2016.github.io/taskmate/Chore-Dependencies/), [timed tasks](https://tempus2016.github.io/taskmate/Timed-Tasks/), [weekly targets](https://tempus2016.github.io/taskmate/Weekly-Targets/) for "three times this week, any day" with an optional bonus for hitting them, [photo proof](https://tempus2016.github.io/taskmate/Photo-Proof/), [open-ended chores](https://tempus2016.github.io/taskmate/Open-Ended-Chores/) the child describes and you price at approval, [teamwork chores](https://tempus2016.github.io/taskmate/Teamwork-Chores/) that need two or more children, [chore auctions](https://tempus2016.github.io/taskmate/Chore-Auctions/) where the lowest bid wins an unpopular job, a [bounty board](https://tempus2016.github.io/taskmate/Bounty-Board/) of one-off jobs any child can claim, [swaps](https://tempus2016.github.io/taskmate/Chore-Swaps/), [vacation mode](https://tempus2016.github.io/taskmate/Vacation-Mode/), and chores that appear or hide based on [HA entity state](https://tempus2016.github.io/taskmate/Dynamic-Chore-Visibility/) or [the weather](https://tempus2016.github.io/taskmate/Weather-Aware-Chores/). Children can [tap an NFC tag](https://tempus2016.github.io/taskmate/NFC-Tag-Completion/) to tick a chore off, and you can add, move and skip chores straight from [Home Assistant's calendar](https://tempus2016.github.io/taskmate/Two-Way-Calendar/). Missed ticking one? [Log a past job](https://tempus2016.github.io/taskmate/Logging-Past-Jobs/) on the day it was really done, up to a week back. Chores can carry an [estimated time](https://tempus2016.github.io/taskmate/Estimated-Minutes/) so children see how long is left, a [reference photo](https://tempus2016.github.io/taskmate/Reference-Photos/) of the job done well, or a [quantity](https://tempus2016.github.io/taskmate/Quantity-Chores/) that pays per item, and pending chores can [approve themselves](https://tempus2016.github.io/taskmate/Auto-Approve/) after a set number of hours. -**Points & rewards** — [fixed-cost rewards](https://tempus2016.github.io/taskmate/Rewards/) with a parent approval flow, [savings jars](https://tempus2016.github.io/taskmate/Pool-Mode-\(Savings-Jars\)/), a [wishlist](https://tempus2016.github.io/taskmate/Wishlist/) children save towards and family can pledge to, [bonuses](https://tempus2016.github.io/taskmate/Bonuses/) and [penalties](https://tempus2016.github.io/taskmate/Penalties/), [weekend multipliers and streak milestones](https://tempus2016.github.io/taskmate/Bonus-Points/), [1–3 star quality ratings](https://tempus2016.github.io/taskmate/Quality-Ratings/) that scale the points, [real-money allowance](https://tempus2016.github.io/taskmate/Allowance/), [shared family goals](https://tempus2016.github.io/taskmate/Family-Goals/), [timed device unlocks](https://tempus2016.github.io/taskmate/Timed-Unlock-Rewards/), and [time-locked rewards](https://tempus2016.github.io/taskmate/Time-Locked-Rewards/) that are only claimable on chosen days or between set hours. Children can buy tickets for a [raffle](https://tempus2016.github.io/taskmate/Raffles/) with their points, a [make-it-right penalty](https://tempus2016.github.io/taskmate/Make-It-Right-Penalties/) can be earned back by doing a chore, and [reward fulfilment](https://tempus2016.github.io/taskmate/Reward-Fulfilment/) keeps a redeemed reward on an owed list until somebody hands it over. +**Points & rewards** — [fixed-cost rewards](https://tempus2016.github.io/taskmate/Rewards/) with a parent approval flow, [savings jars](https://tempus2016.github.io/taskmate/Pool-Mode-\(Savings-Jars\)/), a [wishlist](https://tempus2016.github.io/taskmate/Wishlist/) children save towards and family can pledge to, [bonuses](https://tempus2016.github.io/taskmate/Bonuses/) and [penalties](https://tempus2016.github.io/taskmate/Penalties/), [weekend multipliers and streak milestones](https://tempus2016.github.io/taskmate/Bonus-Points/), [1–3 star quality ratings](https://tempus2016.github.io/taskmate/Quality-Ratings/) that scale the points, [real-money allowance](https://tempus2016.github.io/taskmate/Allowance/), [shared family goals](https://tempus2016.github.io/taskmate/Family-Goals/), [timed device unlocks](https://tempus2016.github.io/taskmate/Timed-Unlock-Rewards/), and [time-locked rewards](https://tempus2016.github.io/taskmate/Time-Locked-Rewards/) that are only claimable on chosen days or between set hours. Children can buy tickets for a [raffle](https://tempus2016.github.io/taskmate/Raffles/) with their points, a [make-it-right penalty](https://tempus2016.github.io/taskmate/Make-It-Right-Penalties/) can be earned back by doing a chore, [boost windows](https://tempus2016.github.io/taskmate/Boost-Windows/) make chosen chores pay ×2 for a while (and can wake the wall tablet to say so), and [reward fulfilment](https://tempus2016.github.io/taskmate/Reward-Fulfilment/) keeps a redeemed reward on an owed list until somebody hands it over. **Gamification** — a [virtual pet](https://tempus2016.github.io/taskmate/Virtual-Pets/) that hatches and grows as chores get done, [personal weekly goals](https://tempus2016.github.io/taskmate/Weekly-Goals/) with a bonus, [personal bests](https://tempus2016.github.io/taskmate/Personal-Bests/) every child can beat whatever their place on the leaderboard, [levels & XP](https://tempus2016.github.io/taskmate/Levels-and-XP/), [achievement badges](https://tempus2016.github.io/taskmate/Achievement-Badges/), [quests](https://tempus2016.github.io/taskmate/Quests/), [challenges](https://tempus2016.github.io/taskmate/Challenges/), [unlockable avatars](https://tempus2016.github.io/taskmate/Avatars/), [celebrations](https://tempus2016.github.io/taskmate/Celebrations/), [leaderboard seasons](https://tempus2016.github.io/taskmate/Leaderboard-Seasons/), [streak freezes](https://tempus2016.github.io/taskmate/Streak-Freezes/) that protect a streak through a missed day, [birthday mode](https://tempus2016.github.io/taskmate/Birthday-Mode/), [surprise inspections](https://tempus2016.github.io/taskmate/Surprise-Inspections/) with a bonus, and "Wrapped"-style [recaps](https://tempus2016.github.io/taskmate/Recaps/) on a schedule you choose. diff --git a/custom_components/taskmate/const.py b/custom_components/taskmate/const.py index 7c6941a9..6e8763c7 100644 --- a/custom_components/taskmate/const.py +++ b/custom_components/taskmate/const.py @@ -373,6 +373,8 @@ def is_valid_completion_sound(value: str | None) -> bool: NOTIF_TYPE_REWARD_OWED: Final = "reward_owed" # Personal bests (#1099): a child beat one of their own records. NOTIF_TYPE_PERSONAL_BEST: Final = "personal_best" +# Boost windows: a boost covering the child just began. +NOTIF_TYPE_BOOST_STARTED: Final = "boost_started" # Reward fulfilment (#1098): default days before parents are reminded a # redeemed reward is still owed (0 = never remind), and the most allowed. diff --git a/custom_components/taskmate/coord_boosts.py b/custom_components/taskmate/coord_boosts.py new file mode 100644 index 00000000..1fcf1eda --- /dev/null +++ b/custom_components/taskmate/coord_boosts.py @@ -0,0 +1,577 @@ +"""Boost windows: a timed multiplier on chosen chores the children can see coming. + +A parent opens a boost on the spot ("the next hour, bins and dishes pay +double"), schedules one for later the same way, or sets a recurring rule in +Settings ("Saturdays 09:00-11:00, garden jobs ×2"). Automations can do the +same through the ``start_boost`` / ``end_boost`` services. + +A chore *completed* inside the window is priced with the multiplier, so +approving it after the window has closed still pays what the child saw. +When two boosts cover the same chore the bigger one applies. + +On special days (the weekend multiplier, a birthday) ``boost_stacking`` +decides: "highest" (default) pays the bigger of the boost and the special-day +multiplier, "stack" multiplies both. + +When a boost begins TaskMate can wake wall tablets: a Fully Kiosk Browser +screen switch is turned on (with its screensaver turned off and the browser +brought to the front), and a Companion-app device is sent +``command_screen_on``. Only those two kinds of target are ever called. +""" + +from __future__ import annotations + +import logging +import re +from datetime import datetime, time, timedelta +from typing import Any + +from homeassistant.helpers import entity_registry as er +from homeassistant.util import dt as dt_util + +from . import notify_strings +from .const import NOTIF_TYPE_BOOST_STARTED +from .models import generate_id + +_LOGGER = logging.getLogger(__name__) + +BOOST_MIN_MULTIPLIER = 1.1 +BOOST_MAX_MULTIPLIER = 5.0 +BOOST_MAX_MINUTES = 24 * 60 +BOOST_NAME_MAX = 60 +BOOST_KEEP = 20 +BOOST_MAX_RULES = 20 +BOOST_STACKING_MODES = ("highest", "stack") +# A boost can be scheduled up to a week ahead. +BOOST_MAX_LEAD = timedelta(days=7) +# How far in the past a start time may be (clock skew on a quick tap). +_PAST_GRACE = timedelta(minutes=5) + +_TIME_RE = re.compile(r"^([01]\d|2[0-3]):([0-5]\d)$") +_MOBILE_APP_RE = re.compile(r"^mobile_app_[a-z0-9_]+$") +_FKB_SCREEN_SUFFIX = "-screenOn" + + +def _parse_time(value: Any) -> time: + m = _TIME_RE.match(str(value or "")) + if not m: + raise ValueError(f"'{value}' is not a time like 09:30.") + return time(int(m.group(1)), int(m.group(2))) + + +def _fmt_multiplier(value: float) -> str: + return f"{value:g}" + + +class BoostsMixin: + """Boost windows, recurring boost rules and the tablet wake-up.""" + + # ── settings ───────────────────────────────────────────────────────── + + def boost_stacking(self) -> str: + mode = str(self.storage.get_setting("boost_stacking", "highest") or "highest") + return mode if mode in BOOST_STACKING_MODES else "highest" + + def _boost_list_setting(self, key: str) -> list[str]: + raw = self.storage.get_setting(key, []) + return [str(v) for v in raw if isinstance(v, str)] if isinstance(raw, list) else [] + + # ── storage ────────────────────────────────────────────────────────── + + def _boosts(self) -> list[dict[str, Any]]: + return self.storage.get_section("boosts", list) + + def boost_rules(self) -> list[dict[str, Any]]: + return self.storage.get_section("boost_rules", list) + + @staticmethod + def _boost_times(boost: dict[str, Any]) -> tuple[datetime, datetime] | None: + try: + return datetime.fromisoformat(boost["starts_at"]), datetime.fromisoformat(boost["ends_at"]) + except (KeyError, TypeError, ValueError): + return None + + def _boost_status(self, boost: dict[str, Any], now: datetime) -> str: + if boost.get("ended_early"): + return "ended" + times = self._boost_times(boost) + if times is None: + return "ended" + start, end = times + if now < start: + return "upcoming" + if now < end: + return "active" + return "ended" + + # ── validation ─────────────────────────────────────────────────────── + + def _check_boost_fields(self, multiplier, chore_ids, child_ids) -> tuple[float, list[str], list[str]]: + try: + mult = round(float(multiplier), 2) + except (TypeError, ValueError): + raise ValueError("The multiplier must be a number.") from None + if not BOOST_MIN_MULTIPLIER <= mult <= BOOST_MAX_MULTIPLIER: + raise ValueError(f"Pick a multiplier from ×{BOOST_MIN_MULTIPLIER:g} to ×{BOOST_MAX_MULTIPLIER:g}.") + chores = list(dict.fromkeys(str(c) for c in (chore_ids or []))) + for cid in chores: + if self.get_chore(cid) is None: + raise ValueError(f"Chore {cid} not found.") + kids = list(dict.fromkeys(str(c) for c in (child_ids or []))) + for cid in kids: + if self.get_child(cid) is None: + raise ValueError(f"Child {cid} not found.") + return mult, chores, kids + + # ── start / end ────────────────────────────────────────────────────── + + async def async_start_boost( + self, + multiplier: float, + minutes: int, + chore_ids: list[str] | None = None, + child_ids: list[str] | None = None, + starts_at: datetime | None = None, + name: str = "", + notify: bool = True, + rule_id: str = "", + rule_day: str = "", + ends_at: datetime | None = None, + ) -> dict[str, Any]: + """Open a boost now, or schedule one. Empty chore/child lists mean all of them.""" + mult, chores, kids = self._check_boost_fields(multiplier, chore_ids, child_ids) + now = dt_util.now() + start = starts_at or now + if start.tzinfo is None: + start = dt_util.as_local(start) if hasattr(dt_util, "as_local") else start + # A recurring rule's window can already be under way when the tick + # (or a rule saved mid-window) picks it up; it runs for what's left. + if start < now - _PAST_GRACE and not rule_id: + raise ValueError("A boost can't start in the past.") + if start > now + BOOST_MAX_LEAD: + raise ValueError("A boost can be scheduled up to a week ahead.") + if ends_at is None: + try: + minutes = int(minutes) + except (TypeError, ValueError): + raise ValueError("The minutes must be a whole number.") from None + if not 1 <= minutes <= BOOST_MAX_MINUTES: + raise ValueError(f"Pick from 1 to {BOOST_MAX_MINUTES} minutes.") + end = start + timedelta(minutes=minutes) + else: + end = ends_at + minutes = max(1, int((end - start).total_seconds() // 60)) + boost = { + "id": generate_id(), + "name": str(name or "").strip()[:BOOST_NAME_MAX], + "multiplier": mult, + "chore_ids": chores, + "child_ids": kids, + "starts_at": start.isoformat(), + "ends_at": end.isoformat(), + "minutes": minutes, + "notify": bool(notify), + "announced": False, + "ended": False, + "ended_early": False, + "created_at": now.isoformat(), + } + if rule_id: + boost["rule_id"] = rule_id + boost["rule_day"] = rule_day + self._boosts().append(boost) + await self.storage.async_save() + if start <= now: + await self._async_announce_boost(boost) + await self.async_refresh() + return {**self._boost_payload(boost), "status": self._boost_status(boost, dt_util.now())} + + async def async_end_boost(self, boost_id: str) -> None: + """End a boost early, or call off one that hasn't started. + + A recurring rule's boost for today has the id ``rule::`` + until it begins; ending that one skips the rule for the day. + """ + now = dt_util.now() + if boost_id.startswith("rule:"): + row = next((b for s, b in self._boost_rows(now) if b.get("id") == boost_id), None) + if row is None: + raise ValueError("That boost has already ended.") + day = boost_id.rsplit(":", 1)[-1] + self._boosts().append( + { + **{ + k: row[k] + for k in ("name", "multiplier", "chore_ids", "child_ids", "starts_at", "ends_at", "minutes") + }, + "id": generate_id(), + "rule_id": row["rule_id"], + "rule_day": day, + "notify": False, + "announced": False, + "ended": True, + "ended_early": True, + "ended_at": now.isoformat(), + "created_at": now.isoformat(), + } + ) + await self.storage.async_save() + await self.async_refresh() + return + boost = next((b for b in self._boosts() if b.get("id") == boost_id), None) + if boost is None or self._boost_status(boost, now) == "ended": + raise ValueError("That boost has already ended.") + was_active = self._boost_status(boost, now) == "active" + boost["ended_early"] = True + boost["ended"] = True + boost["ended_at"] = now.isoformat() + await self.storage.async_save() + if was_active or boost.get("announced"): + self._fire_boost_ended(boost, early=True) + await self.async_refresh() + + def _boost_payload(self, boost: dict[str, Any]) -> dict[str, Any]: + return { + "id": boost["id"], + "name": boost.get("name", ""), + "multiplier": boost["multiplier"], + "chore_ids": list(boost.get("chore_ids") or []), + "child_ids": list(boost.get("child_ids") or []), + "starts_at": boost["starts_at"], + "ends_at": boost["ends_at"], + "minutes": boost.get("minutes", 0), + **({"rule_id": boost["rule_id"]} if boost.get("rule_id") else {}), + } + + def _fire_boost_ended(self, boost: dict[str, Any], early: bool) -> None: + self.hass.bus.async_fire( + "taskmate_boost_ended", + {**self._boost_payload(boost), "ended_early": early, "timestamp": dt_util.now().isoformat()}, + ) + + async def _async_announce_boost(self, boost: dict[str, Any]) -> None: + """The moment a boost goes live: event, push, wake the tablets. Once.""" + if boost.get("announced"): + return + boost["announced"] = True + await self.storage.async_save() + payload = self._boost_payload(boost) + self.hass.bus.async_fire("taskmate_boost_started", {**payload, "timestamp": dt_util.now().isoformat()}) + if boost.get("notify", True) and getattr(self, "notifications", None): + chore_names = [c.name for cid in payload["chore_ids"] if (c := self.get_chore(cid))] + kids = payload["child_ids"] or [c.id for c in self.storage.get_children()] + try: + await self.notifications.fire( + NOTIF_TYPE_BOOST_STARTED, + { + "boost_id": boost["id"], + "name": payload["name"], + "multiplier": _fmt_multiplier(payload["multiplier"]), + "minutes": payload["minutes"], + "chores_text": ", ".join(chore_names) or notify_strings.text(self.hass, "boost_all_chores"), + "points_name": self.storage.get_points_name(), + }, + only_recipients={f"child:{cid}" for cid in kids}, + ) + except Exception: # noqa: BLE001 - a push must never stop the boost + _LOGGER.exception("TaskMate: boost notification failed") + await self.async_wake_boost_screens() + + # ── the tick ───────────────────────────────────────────────────────── + + async def async_check_boosts(self, refresh: bool = True) -> int: + """Start rule boosts, announce scheduled ones that began, close finished ones. + + Returns how many boosts changed state. Runs from the minutely tick. + """ + now = dt_util.now() + changed = 0 + changed += await self._async_fire_rules(now) + for boost in list(self._boosts()): + status = self._boost_status(boost, now) + if status == "active" and not boost.get("announced"): + await self._async_announce_boost(boost) + changed += 1 + elif status == "ended" and not boost.get("ended"): + boost["ended"] = True + if boost.get("announced"): + self._fire_boost_ended(boost, early=False) + changed += 1 + if changed: + self._prune_boosts() + await self.storage.async_save() + if refresh: + await self.async_refresh() + return changed + + def _prune_boosts(self) -> None: + boosts = self._boosts() + done = [b for b in boosts if b.get("ended")] + extra = len(done) - BOOST_KEEP + if extra > 0: + drop = {id(b) for b in sorted(done, key=lambda b: b.get("ends_at", ""))[:extra]} + boosts[:] = [b for b in boosts if id(b) not in drop] + + # ── recurring rules ────────────────────────────────────────────────── + + def _rule_window(self, rule: dict[str, Any], day) -> tuple[datetime, datetime]: + tz = dt_util.now().tzinfo + start = datetime.combine(day, _parse_time(rule["start"]), tzinfo=tz) + end = datetime.combine(day, _parse_time(rule["end"]), tzinfo=tz) + return start, end + + def _rule_ran(self, rule_id: str, day_iso: str) -> bool: + return any(b.get("rule_id") == rule_id and b.get("rule_day") == day_iso for b in self._boosts()) + + async def _async_fire_rules(self, now: datetime) -> int: + started = 0 + today = now.date() + for rule in self.boost_rules(): + if not rule.get("enabled", True) or today.weekday() not in (rule.get("days") or []): + continue + try: + start, end = self._rule_window(rule, today) + except ValueError: + continue + if not start <= now < end or self._rule_ran(rule["id"], today.isoformat()): + continue + try: + await self.async_start_boost( + multiplier=rule["multiplier"], + minutes=0, + chore_ids=[c for c in rule.get("chore_ids") or [] if self.get_chore(c)], + child_ids=[c for c in rule.get("child_ids") or [] if self.get_child(c)], + starts_at=start, + ends_at=end, + name=rule.get("name", ""), + notify=rule.get("notify", True), + rule_id=rule["id"], + rule_day=today.isoformat(), + ) + started += 1 + except ValueError as err: + _LOGGER.warning("TaskMate: boost rule '%s' could not start: %s", rule.get("name"), err) + return started + + async def async_save_boost_rule(self, rule: dict[str, Any]) -> dict[str, Any]: + """Add or replace a recurring boost rule (matched on ``id``).""" + days = sorted({int(d) for d in (rule.get("days") or []) if str(d).lstrip("-").isdigit() and 0 <= int(d) <= 6}) + if not days: + raise ValueError("Pick at least one day.") + start, end = _parse_time(rule.get("start")), _parse_time(rule.get("end")) + if end <= start: + raise ValueError("The end time must be after the start time.") + mult, chores, kids = self._check_boost_fields( + rule.get("multiplier"), rule.get("chore_ids"), rule.get("child_ids") + ) + rules = self.boost_rules() + rule_id = str(rule.get("id") or "") + existing = next((r for r in rules if r.get("id") == rule_id), None) if rule_id else None + if existing is None and len(rules) >= BOOST_MAX_RULES: + raise ValueError(f"Up to {BOOST_MAX_RULES} recurring boosts.") + clean = { + "id": rule_id if existing else generate_id(), + "name": str(rule.get("name") or "").strip()[:BOOST_NAME_MAX], + "days": days, + "start": start.strftime("%H:%M"), + "end": end.strftime("%H:%M"), + "multiplier": mult, + "chore_ids": chores, + "child_ids": kids, + "notify": bool(rule.get("notify", True)), + "enabled": bool(rule.get("enabled", True)), + } + if existing is not None: + existing.clear() + existing.update(clean) + else: + rules.append(clean) + await self.storage.async_save() + await self.async_refresh() + return dict(clean) + + async def async_delete_boost_rule(self, rule_id: str) -> None: + rules = self.boost_rules() + if not any(r.get("id") == rule_id for r in rules): + raise ValueError("That recurring boost no longer exists.") + rules[:] = [r for r in rules if r.get("id") != rule_id] + await self.storage.async_save() + await self.async_refresh() + + # ── what applies to a completion ───────────────────────────────────── + + def _boost_rows(self, now: datetime) -> list[tuple[str, dict[str, Any]]]: + """Every live boost plus today's enabled rules that haven't produced one yet.""" + rows = [(self._boost_status(b, now), b) for b in self._boosts()] + rows = [(s, b) for s, b in rows if s != "ended"] + today = now.date() + for rule in self.boost_rules(): + if not rule.get("enabled", True) or today.weekday() not in (rule.get("days") or []): + continue + if self._rule_ran(rule["id"], today.isoformat()): + continue + try: + start, end = self._rule_window(rule, today) + except ValueError: + continue + if now >= end: + continue + rows.append( + ( + "upcoming" if now < start else "active", + { + "id": f"rule:{rule['id']}:{today.isoformat()}", + "name": rule.get("name", ""), + "multiplier": rule["multiplier"], + "chore_ids": rule.get("chore_ids") or [], + "child_ids": rule.get("child_ids") or [], + "starts_at": start.isoformat(), + "ends_at": end.isoformat(), + "minutes": int((end - start).total_seconds() // 60), + "rule_id": rule["id"], + }, + ) + ) + return rows + + def boost_multiplier_for(self, chore_id: str, child_id: str, when: datetime | None = None) -> float: + """The biggest active boost covering this chore for this child, or 0.""" + now = when or dt_util.now() + best = 0.0 + for status, boost in self._boost_rows(now): + if status != "active": + continue + if boost.get("chore_ids") and chore_id not in boost["chore_ids"]: + continue + if boost.get("child_ids") and child_id not in boost["child_ids"]: + continue + best = max(best, float(boost.get("multiplier") or 0)) + return best + + def special_day_multiplier(self, child, day) -> float: + """What the weekend and birthday bonuses together would multiply a chore by.""" + mult = 1.0 + if day.weekday() in (5, 6): + try: + weekend = float(self.storage.get_setting("weekend_multiplier", "2.0")) + except (ValueError, TypeError): + weekend = 2.0 + if weekend > 1.0: + mult *= weekend + if hasattr(self, "is_birthday") and self.is_birthday(child, day): + mult *= self.birthday_multiplier() + return mult + + def apply_boost(self, chore, child, points: int, when: datetime) -> tuple[int, float, bool]: + """Price a completion made at ``when``. Returns (points, multiplier used or 0, stacked).""" + if points <= 0: + return points, 0.0, False + mult = self.boost_multiplier_for(chore.id, child.id, when) + if mult <= 1.0: + return points, 0.0, False + if self.boost_stacking() == "stack": + return round(points * mult), mult, True + special = self.special_day_multiplier(child, dt_util.as_local(when).date()) + if mult <= special: + # Highest wins and the special day already pays more. + return points, 0.0, False + return round(points * mult), mult, False + + # ── what the cards and panel see ───────────────────────────────────── + + def boosts_state(self) -> list[dict[str, Any]]: + """Active and upcoming boosts, active first, then by start time.""" + now = dt_util.now() + out = [] + for status, boost in self._boost_rows(now): + row = self._boost_payload(boost) + row["status"] = status + row["chore_names"] = [c.name for cid in row["chore_ids"] if (c := self.get_chore(cid))] + out.append(row) + out.sort(key=lambda r: (r["status"] != "active", r["starts_at"])) + return out + + # ── waking the wall tablets ────────────────────────────────────────── + + def _fkb_targets(self) -> list[tuple[str, str, str]]: + """(domain, service, entity_id) calls for each chosen Fully Kiosk screen.""" + wanted = self._boost_list_setting("boost_wake_screens") + if not wanted: + return [] + registry = er.async_get(self.hass) + entities = getattr(registry, "entities", {}) or {} + calls: list[tuple[str, str, str]] = [] + for entity_id in wanted: + entry = registry.async_get(entity_id) if hasattr(registry, "async_get") else entities.get(entity_id) + if entry is None or getattr(entry, "platform", "") != "fully_kiosk": + continue + unique_id = str(getattr(entry, "unique_id", "") or "") + if not entity_id.startswith("switch.") or not unique_id.endswith(_FKB_SCREEN_SUFFIX): + continue + device_prefix = unique_id[: -len(_FKB_SCREEN_SUFFIX)] + calls.append(("switch", "turn_on", entity_id)) + for other in entities.values() if isinstance(entities, dict) else []: + if getattr(other, "platform", "") != "fully_kiosk": + continue + other_uid = str(getattr(other, "unique_id", "") or "") + if other_uid == f"{device_prefix}-screensaver" and other.entity_id.startswith("switch."): + calls.append(("switch", "turn_off", other.entity_id)) + elif other_uid == f"{device_prefix}-toForeground" and other.entity_id.startswith("button."): + calls.append(("button", "press", other.entity_id)) + return calls + + def _companion_targets(self) -> list[str]: + return [s for s in self._boost_list_setting("boost_wake_devices") if _MOBILE_APP_RE.match(s)] + + async def async_wake_boost_screens(self) -> int: + """Turn the chosen tablets' screens on. Failures are logged, never raised.""" + sent = 0 + try: + calls = self._fkb_targets() + except Exception: # noqa: BLE001 + _LOGGER.exception("TaskMate: could not read the Fully Kiosk screens to wake") + calls = [] + for domain, service, entity_id in calls: + try: + await self.hass.services.async_call(domain, service, {"entity_id": entity_id}, blocking=False) + sent += 1 + except Exception: # noqa: BLE001 + _LOGGER.warning("TaskMate: could not wake %s", entity_id, exc_info=True) + for notify_service in self._companion_targets(): + if not self.hass.services.has_service("notify", notify_service): + continue + try: + await self.hass.services.async_call( + "notify", notify_service, {"message": "command_screen_on"}, blocking=False + ) + sent += 1 + except Exception: # noqa: BLE001 + _LOGGER.warning("TaskMate: could not wake %s", notify_service, exc_info=True) + return sent + + def boost_wake_candidates(self) -> dict[str, list[dict[str, str]]]: + """Fully Kiosk screen switches and Companion-app devices a parent can pick.""" + screens: list[dict[str, str]] = [] + try: + registry = er.async_get(self.hass) + for entry in (getattr(registry, "entities", {}) or {}).values(): + if getattr(entry, "platform", "") != "fully_kiosk" or not entry.entity_id.startswith("switch."): + continue + if not str(getattr(entry, "unique_id", "") or "").endswith(_FKB_SCREEN_SUFFIX): + continue + state = self.hass.states.get(entry.entity_id) + name = (state.attributes.get("friendly_name") if state else None) or entry.entity_id + screens.append({"entity_id": entry.entity_id, "name": str(name)}) + except Exception: # noqa: BLE001 + _LOGGER.debug("TaskMate: no entity registry for wake candidates", exc_info=True) + devices: list[dict[str, str]] = [] + try: + services = self.hass.services.async_services().get("notify", {}) + for name in services: + if _MOBILE_APP_RE.match(name): + devices.append({"service": name, "name": name[len("mobile_app_") :].replace("_", " ").title()}) + except Exception: # noqa: BLE001 + _LOGGER.debug("TaskMate: could not list notify services", exc_info=True) + screens.sort(key=lambda s: s["name"].lower()) + devices.sort(key=lambda d: d["name"].lower()) + return {"screens": screens, "devices": devices} diff --git a/custom_components/taskmate/coord_chores.py b/custom_components/taskmate/coord_chores.py index 8fb238f7..db42b679 100644 --- a/custom_components/taskmate/coord_chores.py +++ b/custom_components/taskmate/coord_chores.py @@ -987,6 +987,8 @@ async def async_complete_chore( note=note, suggested_points=suggested_points, quantity=quantity, + # A won auction pays exactly the bid. + boostable=auction_price is None, ) if redo is not None: self._inspection_on_redo_recorded(redo, completion.id) @@ -1056,9 +1058,13 @@ async def _async_record_completion( suggested_points: int = 0, backdated: bool = False, quantity: int = 0, + boostable: bool = True, ) -> ChoreCompletion: """Store one completion and, when auto-approved, pay it. + ``boostable`` lets an active boost window multiply ``points``. Off for + a job logged for an earlier day and for a won auction's fixed price. + The part of completing a chore that is per child. The caller has already run every eligibility gate and then calls _async_after_completions once for the whole batch (one child normally, a whole team for #928). @@ -1068,6 +1074,9 @@ async def _async_record_completion( bonuses follow the day) but leaves the streak alone, and only moves the recurrence window forward, never back. """ + boost_mult, boost_stacked = 0.0, False + if boostable and not backdated and hasattr(self, "apply_boost"): + points, boost_mult, boost_stacked = self.apply_boost(chore, child, points, now) completion = ChoreCompletion( chore_id=chore.id, child_id=child.id, @@ -1084,6 +1093,8 @@ async def _async_record_completion( child_undo_allowed=not as_parent and undo_window_seconds(self.storage) > 0, backdated=backdated, quantity=quantity, + boost_multiplier=boost_mult, + boost_stacked=boost_stacked, ) # Record the completion before awarding anything. Awarding can suspend @@ -1103,7 +1114,13 @@ async def _async_record_completion( chore_id=chore.id, ) else: - total_awarded = await self._award_points(child, points, chore_id=chore.id) + total_awarded = await self._award_points( + child, + points, + chore_id=chore.id, + # A boost that replaced the weekend/birthday bonuses. + **({"special_bonuses": False} if boost_mult and not boost_stacked else {}), + ) completion.approved = True completion.approved_at = dt_util.now() completion.points_awarded = total_awarded @@ -1642,6 +1659,14 @@ async def async_approve_chore( completion_date=comp_date, skip_streak=is_bonus, chore_id=completion.chore_id, + # A boost that replaced the weekend/birthday bonuses + # at submission keeps them out here too. + **( + {"special_bonuses": False} + if getattr(completion, "boost_multiplier", 0) + and not getattr(completion, "boost_stacked", False) + else {} + ), ) completion.points_awarded = total_awarded self.storage.update_completion(completion) diff --git a/custom_components/taskmate/coord_notifications.py b/custom_components/taskmate/coord_notifications.py index fddc19eb..5f62e71c 100644 --- a/custom_components/taskmate/coord_notifications.py +++ b/custom_components/taskmate/coord_notifications.py @@ -32,6 +32,7 @@ NOTIF_TYPE_BADGE_EARNED, NOTIF_TYPE_BEDTIME_REMINDER, NOTIF_TYPE_BIRTHDAY, + NOTIF_TYPE_BOOST_STARTED, NOTIF_TYPE_BOUNTY_CLAIM_LAPSING, NOTIF_TYPE_BOUNTY_POSTED, NOTIF_TYPE_CELEBRATION, @@ -194,6 +195,8 @@ class NotificationTypeMeta: NotificationTypeMeta(NOTIF_TYPE_REWARD_OWED, "parent", False, False, False, True), # Personal bests (#1099): opt-in, like every celebration added after release. NotificationTypeMeta(NOTIF_TYPE_PERSONAL_BEST, "both", False, False, False, False), + # Boost windows: the children a boost covers hear it began. Opt-in. + NotificationTypeMeta(NOTIF_TYPE_BOOST_STARTED, "child", False, False, False, False), ] NOTIFICATION_TYPES_BY_ID: dict[str, NotificationTypeMeta] = {t.id: t for t in NOTIFICATION_TYPES} @@ -204,6 +207,7 @@ class NotificationTypeMeta: _OWN_EVENT_TYPES: frozenset[str] = frozenset( { NOTIF_TYPE_AUCTION_OPENED, + NOTIF_TYPE_BOOST_STARTED, NOTIF_TYPE_PERSONAL_BEST, NOTIF_TYPE_BADGE_EARNED, NOTIF_TYPE_BOUNTY_POSTED, @@ -506,6 +510,7 @@ async def send_test(self, type_id: str) -> list[str]: "winner_name": "Alex", "tickets": 12, "record_label": notify_strings.text(self.hass, "record_longest_streak"), + "chores_text": sample["chore"], "value": 12, } ctx["result_text"] = notify_strings.render( diff --git a/custom_components/taskmate/coord_points.py b/custom_components/taskmate/coord_points.py index ae0618a7..80709b8b 100644 --- a/custom_components/taskmate/coord_points.py +++ b/custom_components/taskmate/coord_points.py @@ -1028,9 +1028,13 @@ async def _award_points( completion_date: date | None = None, skip_streak: bool = False, chore_id: str | None = None, + special_bonuses: bool = True, ) -> int: """Award points to a child, update streak, and apply bonus systems. + ``special_bonuses=False`` leaves out the weekend and birthday bonuses: + a boost already replaced them ("highest wins", see coord_boosts). + Returns the total points awarded (base + weekend + birthday bonus), excluding milestone bonuses (which are logged as separate transactions). @@ -1051,7 +1055,7 @@ async def _award_points( multiplier = 2.0 weekend_bonus = 0 - if effective_date.weekday() in (5, 6) and multiplier > 1.0: + if special_bonuses and effective_date.weekday() in (5, 6) and multiplier > 1.0: weekend_bonus = round(points * (multiplier - 1.0)) # ── Birthday multiplier (#924) ────────────────────────────────────── @@ -1060,7 +1064,7 @@ async def _award_points( # (Named "celebration_*" rather than after the birthday so CodeQL's # personal-data heuristics don't read a points multiplier as PII.) celebration_bonus = 0 - if self.is_birthday(child, effective_date): + if special_bonuses and self.is_birthday(child, effective_date): celebration_multiplier = self.birthday_multiplier() if celebration_multiplier > 1.0: celebration_bonus = round((points + weekend_bonus) * (celebration_multiplier - 1.0)) diff --git a/custom_components/taskmate/coordinator.py b/custom_components/taskmate/coordinator.py index df21bfce..eec460f3 100644 --- a/custom_components/taskmate/coordinator.py +++ b/custom_components/taskmate/coordinator.py @@ -25,6 +25,7 @@ from .coord_badges import BadgeCoordinator from .coord_bests import PersonalBestsMixin from .coord_birthdays import BirthdaysMixin +from .coord_boosts import BoostsMixin from .coord_bounties import BountiesMixin from .coord_calendar import CalendarMixin from .coord_challenges import ChallengesMixin @@ -112,6 +113,7 @@ class TaskMateCoordinator( WishlistMixin, FulfilmentMixin, PersonalBestsMixin, + BoostsMixin, BountiesMixin, AuctionsMixin, RecapsMixin, @@ -512,6 +514,7 @@ async def async_run_minutely_checks(self) -> None: self.async_draw_due_raffles, self.async_check_pet_growth, self.async_check_owed_rewards, + self.async_check_boosts, ): try: await step() diff --git a/custom_components/taskmate/event.py b/custom_components/taskmate/event.py index c4121817..a61996f9 100644 --- a/custom_components/taskmate/event.py +++ b/custom_components/taskmate/event.py @@ -73,6 +73,8 @@ "bounty_posted": "taskmate_bounty_posted", "scheduled_change_applied": "taskmate_scheduled_change_applied", "raffle_drawn": notification_event_name(NOTIF_TYPE_RAFFLE_DRAWN), + "boost_started": "taskmate_boost_started", + "boost_ended": "taskmate_boost_ended", } # Payload keys never copied onto the entity: they are long or internal. diff --git a/custom_components/taskmate/family_services.py b/custom_components/taskmate/family_services.py index fad30f0d..6471087b 100644 --- a/custom_components/taskmate/family_services.py +++ b/custom_components/taskmate/family_services.py @@ -16,6 +16,7 @@ from homeassistant.helpers import config_validation as cv from .const import DOMAIN +from .coord_boosts import BOOST_MAX_MINUTES, BOOST_MAX_MULTIPLIER, BOOST_MIN_MULTIPLIER, BOOST_NAME_MAX from .coord_goals import WEEKLY_GOAL_MAX from .coord_pets import PET_NAME_MAX, PET_SPECIES from .coord_wellbeing import HELP_MESSAGE_MAX, MOODS @@ -31,9 +32,13 @@ SERVICE_DRAW_RAFFLE = "draw_raffle" SERVICE_ADOPT_PET = "adopt_pet" SERVICE_MARK_REWARD_DELIVERED = "mark_reward_delivered" +SERVICE_START_BOOST = "start_boost" +SERVICE_END_BOOST = "end_boost" FAMILY_SERVICES: tuple[str, ...] = ( SERVICE_MARK_REWARD_DELIVERED, + SERVICE_START_BOOST, + SERVICE_END_BOOST, SERVICE_REQUEST_HELP, SERVICE_ANSWER_HELP, SERVICE_LOG_MOOD, @@ -97,6 +102,20 @@ async def adopt_pet(coordinator, call): async def draw_raffle(coordinator, call): await coordinator.async_draw_raffle(call.data["raffle_id"]) + async def start_boost(coordinator, call): + await coordinator.async_start_boost( + multiplier=call.data["multiplier"], + minutes=call.data["minutes"], + chore_ids=call.data.get("chore_ids") or [], + child_ids=call.data.get("child_ids") or [], + starts_at=call.data.get("starts_at"), + name=call.data.get("name", ""), + notify=call.data.get("notify", True), + ) + + async def end_boost(coordinator, call): + await coordinator.async_end_boost(call.data["boost_id"]) + # Reward fulfilment (#1098): a parent marks a reward handed over, or the # child confirms their own with ``child_id`` — so the one service has two # gates and picks by who is calling. @@ -169,6 +188,23 @@ async def mark_reward_delivered(call: ServiceCall) -> None: }, ), (SERVICE_DRAW_RAFFLE, draw_raffle, False, {vol.Required("raffle_id"): cv.string}), + ( + SERVICE_START_BOOST, + start_boost, + False, + { + vol.Required("multiplier"): vol.All( + vol.Coerce(float), vol.Range(min=BOOST_MIN_MULTIPLIER, max=BOOST_MAX_MULTIPLIER) + ), + vol.Required("minutes"): vol.All(vol.Coerce(int), vol.Range(min=1, max=BOOST_MAX_MINUTES)), + vol.Optional("chore_ids", default=[]): vol.All(cv.ensure_list, [cv.string]), + vol.Optional("child_ids", default=[]): vol.All(cv.ensure_list, [cv.string]), + vol.Optional("starts_at"): cv.datetime, + vol.Optional("name", default=""): vol.All(cv.string, vol.Length(max=BOOST_NAME_MAX)), + vol.Optional("notify", default=True): cv.boolean, + }, + ), + (SERVICE_END_BOOST, end_boost, False, {vol.Required("boost_id"): cv.string}), ( SERVICE_ADOPT_PET, adopt_pet, diff --git a/custom_components/taskmate/models.py b/custom_components/taskmate/models.py index aacfcce3..17a1335f 100644 --- a/custom_components/taskmate/models.py +++ b/custom_components/taskmate/models.py @@ -1178,6 +1178,12 @@ class ChoreCompletion: # Set on a parent completion (child_id "__parent__") that dismisses the # chore for this one child only (#1096). Empty = the whole pool. for_child_id: str = "" + # Boost windows: the multiplier a boost applied to submitted_points, or 0. + # ``boost_stacked`` is True when it was stacked on the weekend/birthday + # bonuses; otherwise the boost replaced them ("highest wins") and approval + # must not add them again. + boost_multiplier: float = 0.0 + boost_stacked: bool = False @classmethod def from_dict(cls, data: dict[str, Any]) -> ChoreCompletion: @@ -1206,6 +1212,8 @@ def from_dict(cls, data: dict[str, Any]) -> ChoreCompletion: quantity=_clamp_int(data.get("quantity"), 0, MAX_QUANTITY), auto_approved=data.get("auto_approved") is True, for_child_id=str(data.get("for_child_id", "") or ""), + boost_multiplier=float(data.get("boost_multiplier", 0) or 0), + boost_stacked=bool(data.get("boost_stacked", False)), ) def to_dict(self) -> dict[str, Any]: @@ -1240,6 +1248,10 @@ def to_dict(self) -> dict[str, Any]: data["auto_approved"] = True if self.for_child_id: data["for_child_id"] = self.for_child_id + if self.boost_multiplier: + data["boost_multiplier"] = self.boost_multiplier + if self.boost_stacked: + data["boost_stacked"] = True return data diff --git a/custom_components/taskmate/notify_strings.py b/custom_components/taskmate/notify_strings.py index 132d8e60..b3623ba4 100644 --- a/custom_components/taskmate/notify_strings.py +++ b/custom_components/taskmate/notify_strings.py @@ -76,6 +76,8 @@ "weekly_goal_reached": "🎯 {child_name} reached their weekly goal of {target} {points_name} — +{bonus} bonus!", "reward_owed": "🎁 {child_name} is still waiting for '{reward_name}' — redeemed {days} days ago.", "personal_best": "🏆 New personal best! {child_name}: {record_label} — {value}.", + "boost_started": "⚡ Boost! {chores_text} pay ×{multiplier} for the next {minutes} minutes.", + "boost_all_chores": "All chores", # Personal best record names, used inside the personal_best message. "record_longest_streak": "longest streak (days)", "record_best_day_points": "most {points_name} in a day", diff --git a/custom_components/taskmate/sensor.py b/custom_components/taskmate/sensor.py index 1c1aad22..3e5d6c15 100644 --- a/custom_components/taskmate/sensor.py +++ b/custom_components/taskmate/sensor.py @@ -1107,7 +1107,7 @@ class TaskMateOverallStatsSensor(_CachedAttrsSensor): # The per-child summary grows with the family; the scalars stay recorded # so history/statistics on them keep working (#817). _unrecorded_attributes = frozenset( - {"children", "vacation_periods", "season_champions", "companion_entities", "badge_entities"} + {"children", "vacation_periods", "season_champions", "companion_entities", "badge_entities", "boosts"} ) def __init__( @@ -1195,7 +1195,10 @@ def _build_attributes(self) -> dict: time_boundaries[f"{cat}_start"] = period["start"] if period else def_start time_boundaries[f"{cat}_end"] = period["end"] if period else def_end + boosts = self.coordinator.boosts_state() return { + # Boost windows: live and upcoming boosts, only when there is one. + **({"boosts": boosts} if boosts else {}), "today_day_of_week": today_dow, "streak_reset_mode": settings.get("streak_reset_mode", "reset"), "weekend_multiplier": _safe_float(settings.get("weekend_multiplier"), 2.0), diff --git a/custom_components/taskmate/services.yaml b/custom_components/taskmate/services.yaml index 80c7407b..155c0bcc 100644 --- a/custom_components/taskmate/services.yaml +++ b/custom_components/taskmate/services.yaml @@ -1873,6 +1873,72 @@ mark_reward_delivered: selector: text: +start_boost: + name: Start a boost + description: Open a boost window. Chores done inside it pay the multiplier. Leave chore_ids or child_ids empty for all of them. + fields: + multiplier: + name: Multiplier + description: What the covered chores pay, e.g. 2 for double (1.1 to 5) + required: true + selector: + number: + min: 1.1 + max: 5 + step: 0.1 + mode: box + minutes: + name: Minutes + description: How long the boost lasts + required: true + selector: + number: + min: 1 + max: 1440 + mode: box + chore_ids: + name: Chore IDs + description: The chores it covers (empty = all chores) + required: false + selector: + object: + child_ids: + name: Child IDs + description: The children it covers (empty = everyone) + required: false + selector: + object: + starts_at: + name: Starts at + description: Start later instead of now (up to a week ahead) + required: false + selector: + datetime: + name: + name: Name + description: Optional label shown on the cards, e.g. "Guests at six" + required: false + selector: + text: + notify: + name: Notify + description: Send the boost push to the children it covers (when that notification is switched on) + required: false + default: true + selector: + boolean: + +end_boost: + name: End a boost + description: Stop a boost early, or call off one that hasn't started yet. + fields: + boost_id: + name: Boost ID + description: The boost, from the boosts attribute of sensor.taskmate_overview + required: true + selector: + text: + buy_raffle_tickets: name: Buy raffle tickets description: A child spends points on tickets for a raffle. Each ticket is one chance in the draw. diff --git a/custom_components/taskmate/strings.json b/custom_components/taskmate/strings.json index d515d579..d59c7dd5 100644 --- a/custom_components/taskmate/strings.json +++ b/custom_components/taskmate/strings.json @@ -1462,6 +1462,50 @@ "description": "The child confirming they received it (leave empty when a parent marks it)" } } + }, + "start_boost": { + "name": "Start a boost", + "description": "Open a boost window. Chores done inside it pay the multiplier. Leave chore_ids or child_ids empty for all of them.", + "fields": { + "multiplier": { + "name": "Multiplier", + "description": "What the covered chores pay, e.g. 2 for double (1.1 to 5)" + }, + "minutes": { + "name": "Minutes", + "description": "How long the boost lasts" + }, + "chore_ids": { + "name": "Chore IDs", + "description": "The chores it covers (empty = all chores)" + }, + "child_ids": { + "name": "Child IDs", + "description": "The children it covers (empty = everyone)" + }, + "starts_at": { + "name": "Starts at", + "description": "Start later instead of now (up to a week ahead)" + }, + "name": { + "name": "Name", + "description": "Optional label shown on the cards, e.g. \"Guests at six\"" + }, + "notify": { + "name": "Notify", + "description": "Send the boost push to the children it covers (when that notification is switched on)" + } + } + }, + "end_boost": { + "name": "End a boost", + "description": "Stop a boost early, or call off one that hasn't started yet.", + "fields": { + "boost_id": { + "name": "Boost ID", + "description": "The boost, from the boosts attribute of sensor.taskmate_overview" + } + } } }, "entity": { @@ -1546,7 +1590,9 @@ "season_champion": "Season champion", "bounty_posted": "Bounty posted", "scheduled_change_applied": "Scheduled change applied", - "raffle_drawn": "Raffle drawn" + "raffle_drawn": "Raffle drawn", + "boost_started": "Boost started", + "boost_ended": "Boost ended" } } } diff --git a/custom_components/taskmate/translations/da.json b/custom_components/taskmate/translations/da.json index 452e2ca7..fabe7cbe 100644 --- a/custom_components/taskmate/translations/da.json +++ b/custom_components/taskmate/translations/da.json @@ -1462,6 +1462,50 @@ "description": "Barnet, der bekræfter at have fået den (lad stå tomt, når en forælder markerer)" } } + }, + "start_boost": { + "name": "Start et boost", + "description": "Åbner et boost-vindue. Opgaver udført i det giver multiplikatoren. Lad chore_ids eller child_ids stå tomme for alle.", + "fields": { + "multiplier": { + "name": "Multiplikator", + "description": "Hvad opgaverne giver, f.eks. 2 for dobbelt (1,1 til 5)" + }, + "minutes": { + "name": "Minutter", + "description": "Hvor længe boostet varer" + }, + "chore_ids": { + "name": "Opgave-ID'er", + "description": "De opgaver, det gælder for (tom = alle)" + }, + "child_ids": { + "name": "Barn-ID'er", + "description": "De børn, det gælder for (tom = alle)" + }, + "starts_at": { + "name": "Starter", + "description": "Start senere i stedet for nu (op til en uge frem)" + }, + "name": { + "name": "Navn", + "description": "Valgfri tekst på kortene, f.eks. \"Gæster kl. 18\"" + }, + "notify": { + "name": "Giv besked", + "description": "Send boost-beskeden til børnene (når den besked er slået til)" + } + } + }, + "end_boost": { + "name": "Afslut et boost", + "description": "Stop et boost før tid, eller aflys et, der ikke er begyndt endnu.", + "fields": { + "boost_id": { + "name": "Boost-ID", + "description": "Boostet, fra attributten boosts på sensor.taskmate_overview" + } + } } }, "entity": { @@ -1546,7 +1590,9 @@ "season_champion": "Sæsonmester", "bounty_posted": "Dusør slået op", "scheduled_change_applied": "Planlagt ændring udført", - "raffle_drawn": "Lodtrækning trukket" + "raffle_drawn": "Lodtrækning trukket", + "boost_started": "Boost startet", + "boost_ended": "Boost slut" } } } diff --git a/custom_components/taskmate/translations/de.json b/custom_components/taskmate/translations/de.json index 3d2d5cf5..ffb0b0ed 100644 --- a/custom_components/taskmate/translations/de.json +++ b/custom_components/taskmate/translations/de.json @@ -1462,6 +1462,50 @@ "description": "Das Kind, das den Erhalt bestätigt (leer lassen, wenn ein Elternteil markiert)" } } + }, + "start_boost": { + "name": "Boost starten", + "description": "Öffnet ein Boost-Fenster. Aufgaben darin zählen mit dem Multiplikator. chore_ids oder child_ids leer lassen für alle.", + "fields": { + "multiplier": { + "name": "Multiplikator", + "description": "Was die Aufgaben zählen, z. B. 2 für doppelt (1,1 bis 5)" + }, + "minutes": { + "name": "Minuten", + "description": "Wie lange der Boost dauert" + }, + "chore_ids": { + "name": "Aufgaben-IDs", + "description": "Die Aufgaben, für die er gilt (leer = alle)" + }, + "child_ids": { + "name": "Kind-IDs", + "description": "Die Kinder, für die er gilt (leer = alle)" + }, + "starts_at": { + "name": "Beginnt um", + "description": "Später statt jetzt beginnen (bis eine Woche im Voraus)" + }, + "name": { + "name": "Name", + "description": "Optionale Bezeichnung auf den Karten, z. B. „Besuch um sechs“" + }, + "notify": { + "name": "Benachrichtigen", + "description": "Die Boost-Nachricht an die Kinder schicken (wenn diese Benachrichtigung eingeschaltet ist)" + } + } + }, + "end_boost": { + "name": "Boost beenden", + "description": "Einen Boost vorzeitig beenden oder einen noch nicht begonnenen absagen.", + "fields": { + "boost_id": { + "name": "Boost-ID", + "description": "Der Boost, aus dem Attribut boosts von sensor.taskmate_overview" + } + } } }, "entity": { @@ -1546,7 +1590,9 @@ "season_champion": "Saisonsieger", "bounty_posted": "Kopfgeld ausgeschrieben", "scheduled_change_applied": "Geplante Änderung angewendet", - "raffle_drawn": "Verlosung gezogen" + "raffle_drawn": "Verlosung gezogen", + "boost_started": "Boost gestartet", + "boost_ended": "Boost beendet" } } } diff --git a/custom_components/taskmate/translations/en-GB.json b/custom_components/taskmate/translations/en-GB.json index d515d579..d59c7dd5 100644 --- a/custom_components/taskmate/translations/en-GB.json +++ b/custom_components/taskmate/translations/en-GB.json @@ -1462,6 +1462,50 @@ "description": "The child confirming they received it (leave empty when a parent marks it)" } } + }, + "start_boost": { + "name": "Start a boost", + "description": "Open a boost window. Chores done inside it pay the multiplier. Leave chore_ids or child_ids empty for all of them.", + "fields": { + "multiplier": { + "name": "Multiplier", + "description": "What the covered chores pay, e.g. 2 for double (1.1 to 5)" + }, + "minutes": { + "name": "Minutes", + "description": "How long the boost lasts" + }, + "chore_ids": { + "name": "Chore IDs", + "description": "The chores it covers (empty = all chores)" + }, + "child_ids": { + "name": "Child IDs", + "description": "The children it covers (empty = everyone)" + }, + "starts_at": { + "name": "Starts at", + "description": "Start later instead of now (up to a week ahead)" + }, + "name": { + "name": "Name", + "description": "Optional label shown on the cards, e.g. \"Guests at six\"" + }, + "notify": { + "name": "Notify", + "description": "Send the boost push to the children it covers (when that notification is switched on)" + } + } + }, + "end_boost": { + "name": "End a boost", + "description": "Stop a boost early, or call off one that hasn't started yet.", + "fields": { + "boost_id": { + "name": "Boost ID", + "description": "The boost, from the boosts attribute of sensor.taskmate_overview" + } + } } }, "entity": { @@ -1546,7 +1590,9 @@ "season_champion": "Season champion", "bounty_posted": "Bounty posted", "scheduled_change_applied": "Scheduled change applied", - "raffle_drawn": "Raffle drawn" + "raffle_drawn": "Raffle drawn", + "boost_started": "Boost started", + "boost_ended": "Boost ended" } } } diff --git a/custom_components/taskmate/translations/en.json b/custom_components/taskmate/translations/en.json index d515d579..d59c7dd5 100644 --- a/custom_components/taskmate/translations/en.json +++ b/custom_components/taskmate/translations/en.json @@ -1462,6 +1462,50 @@ "description": "The child confirming they received it (leave empty when a parent marks it)" } } + }, + "start_boost": { + "name": "Start a boost", + "description": "Open a boost window. Chores done inside it pay the multiplier. Leave chore_ids or child_ids empty for all of them.", + "fields": { + "multiplier": { + "name": "Multiplier", + "description": "What the covered chores pay, e.g. 2 for double (1.1 to 5)" + }, + "minutes": { + "name": "Minutes", + "description": "How long the boost lasts" + }, + "chore_ids": { + "name": "Chore IDs", + "description": "The chores it covers (empty = all chores)" + }, + "child_ids": { + "name": "Child IDs", + "description": "The children it covers (empty = everyone)" + }, + "starts_at": { + "name": "Starts at", + "description": "Start later instead of now (up to a week ahead)" + }, + "name": { + "name": "Name", + "description": "Optional label shown on the cards, e.g. \"Guests at six\"" + }, + "notify": { + "name": "Notify", + "description": "Send the boost push to the children it covers (when that notification is switched on)" + } + } + }, + "end_boost": { + "name": "End a boost", + "description": "Stop a boost early, or call off one that hasn't started yet.", + "fields": { + "boost_id": { + "name": "Boost ID", + "description": "The boost, from the boosts attribute of sensor.taskmate_overview" + } + } } }, "entity": { @@ -1546,7 +1590,9 @@ "season_champion": "Season champion", "bounty_posted": "Bounty posted", "scheduled_change_applied": "Scheduled change applied", - "raffle_drawn": "Raffle drawn" + "raffle_drawn": "Raffle drawn", + "boost_started": "Boost started", + "boost_ended": "Boost ended" } } } diff --git a/custom_components/taskmate/translations/fr.json b/custom_components/taskmate/translations/fr.json index 9487970e..e7ad25e6 100644 --- a/custom_components/taskmate/translations/fr.json +++ b/custom_components/taskmate/translations/fr.json @@ -1462,6 +1462,50 @@ "description": "L’enfant qui confirme l’avoir reçue (laisser vide quand un parent la marque)" } } + }, + "start_boost": { + "name": "Lancer un boost", + "description": "Ouvre une fenêtre de boost. Les tâches faites pendant ce temps rapportent le multiplicateur. Laissez chore_ids ou child_ids vides pour tout le monde.", + "fields": { + "multiplier": { + "name": "Multiplicateur", + "description": "Ce que rapportent les tâches, p. ex. 2 pour le double (1,1 à 5)" + }, + "minutes": { + "name": "Minutes", + "description": "Durée du boost" + }, + "chore_ids": { + "name": "ID des tâches", + "description": "Les tâches concernées (vide = toutes)" + }, + "child_ids": { + "name": "ID des enfants", + "description": "Les enfants concernés (vide = tous)" + }, + "starts_at": { + "name": "Début", + "description": "Commencer plus tard plutôt que maintenant (jusqu’à une semaine à l’avance)" + }, + "name": { + "name": "Nom", + "description": "Libellé facultatif affiché sur les cartes, p. ex. « Invités à 18 h »" + }, + "notify": { + "name": "Notifier", + "description": "Envoyer la notification du boost aux enfants concernés (si elle est activée)" + } + } + }, + "end_boost": { + "name": "Terminer un boost", + "description": "Arrêter un boost plus tôt, ou annuler un boost qui n’a pas encore commencé.", + "fields": { + "boost_id": { + "name": "ID du boost", + "description": "Le boost, depuis l’attribut boosts de sensor.taskmate_overview" + } + } } }, "entity": { @@ -1546,7 +1590,9 @@ "season_champion": "Champion de la saison", "bounty_posted": "Prime publiée", "scheduled_change_applied": "Modification planifiée appliquée", - "raffle_drawn": "Tombola tirée" + "raffle_drawn": "Tombola tirée", + "boost_started": "Boost lancé", + "boost_ended": "Boost terminé" } } } diff --git a/custom_components/taskmate/translations/nb.json b/custom_components/taskmate/translations/nb.json index d5f76fd4..a99fdae1 100644 --- a/custom_components/taskmate/translations/nb.json +++ b/custom_components/taskmate/translations/nb.json @@ -1462,6 +1462,50 @@ "description": "Barnet som bekrefter å ha fått den (la stå tom når en forelder merker)" } } + }, + "start_boost": { + "name": "Start et boost", + "description": "Åpner et boost-vindu. Oppgaver gjort i det gir multiplikatoren. La chore_ids eller child_ids stå tomme for alle.", + "fields": { + "multiplier": { + "name": "Multiplikator", + "description": "Hva oppgavene gir, f.eks. 2 for dobbelt (1,1 til 5)" + }, + "minutes": { + "name": "Minutter", + "description": "Hvor lenge boostet varer" + }, + "chore_ids": { + "name": "Oppgave-ID-er", + "description": "Oppgavene det gjelder (tom = alle)" + }, + "child_ids": { + "name": "Barn-ID-er", + "description": "Barna det gjelder (tom = alle)" + }, + "starts_at": { + "name": "Starter", + "description": "Start senere i stedet for nå (opptil en uke frem)" + }, + "name": { + "name": "Navn", + "description": "Valgfri tekst på kortene, f.eks. «Gjester kl. 18»" + }, + "notify": { + "name": "Varsle", + "description": "Send boost-varselet til barna (når det varselet er på)" + } + } + }, + "end_boost": { + "name": "Avslutt et boost", + "description": "Stopp et boost tidlig, eller avlys et som ikke har begynt.", + "fields": { + "boost_id": { + "name": "Boost-ID", + "description": "Boostet, fra attributtet boosts på sensor.taskmate_overview" + } + } } }, "entity": { @@ -1546,7 +1590,9 @@ "season_champion": "Sesongmester", "bounty_posted": "Dusør lagt ut", "scheduled_change_applied": "Planlagt endring utført", - "raffle_drawn": "Loddtrekning trukket" + "raffle_drawn": "Loddtrekning trukket", + "boost_started": "Boost startet", + "boost_ended": "Boost avsluttet" } } } diff --git a/custom_components/taskmate/translations/nl.json b/custom_components/taskmate/translations/nl.json index 4adf6bed..9ebc480c 100644 --- a/custom_components/taskmate/translations/nl.json +++ b/custom_components/taskmate/translations/nl.json @@ -1462,6 +1462,50 @@ "description": "Het kind dat bevestigt dat het de beloning heeft gekregen (leeg laten als een ouder het markeert)" } } + }, + "start_boost": { + "name": "Boost starten", + "description": "Open een boostvenster. Taken die je daarin doet, leveren de vermenigvuldiger op. Laat chore_ids of child_ids leeg voor allemaal.", + "fields": { + "multiplier": { + "name": "Vermenigvuldiger", + "description": "Wat de gekozen taken opleveren, bijv. 2 voor dubbel (1,1 tot 5)" + }, + "minutes": { + "name": "Minuten", + "description": "Hoe lang de boost duurt" + }, + "chore_ids": { + "name": "Taak-ID's", + "description": "De taken die meedoen (leeg = alle taken)" + }, + "child_ids": { + "name": "Kind-ID's", + "description": "De kinderen die meedoen (leeg = iedereen)" + }, + "starts_at": { + "name": "Begint om", + "description": "Later beginnen in plaats van nu (tot een week vooruit)" + }, + "name": { + "name": "Naam", + "description": "Optioneel label op de kaarten, bijv. \"Om zes uur visite\"" + }, + "notify": { + "name": "Melden", + "description": "Stuur de boostmelding naar de kinderen die meedoen (als die melding aanstaat)" + } + } + }, + "end_boost": { + "name": "Boost beëindigen", + "description": "Stop een boost eerder, of annuleer er een die nog niet begonnen is.", + "fields": { + "boost_id": { + "name": "Boost-ID", + "description": "De boost, uit het attribuut boosts van sensor.taskmate_overview" + } + } } }, "entity": { @@ -1546,7 +1590,9 @@ "season_champion": "Maandkampioen", "bounty_posted": "Klus geplaatst", "scheduled_change_applied": "Geplande wijziging toegepast", - "raffle_drawn": "Loterij getrokken" + "raffle_drawn": "Loterij getrokken", + "boost_started": "Boost gestart", + "boost_ended": "Boost beëindigd" } } } diff --git a/custom_components/taskmate/translations/nn.json b/custom_components/taskmate/translations/nn.json index 5b0b2be7..90c4cf13 100644 --- a/custom_components/taskmate/translations/nn.json +++ b/custom_components/taskmate/translations/nn.json @@ -1462,6 +1462,50 @@ "description": "Barnet som stadfestar å ha fått henne (la stå tom når ein forelder merkjer)" } } + }, + "start_boost": { + "name": "Start eit boost", + "description": "Opnar eit boost-vindauge. Oppgåver gjorde i det gjev multiplikatoren. La chore_ids eller child_ids stå tomme for alle.", + "fields": { + "multiplier": { + "name": "Multiplikator", + "description": "Kva oppgåvene gjev, t.d. 2 for dobbelt (1,1 til 5)" + }, + "minutes": { + "name": "Minutt", + "description": "Kor lenge boostet varer" + }, + "chore_ids": { + "name": "Oppgåve-ID-ar", + "description": "Oppgåvene det gjeld (tom = alle)" + }, + "child_ids": { + "name": "Barn-ID-ar", + "description": "Borna det gjeld (tom = alle)" + }, + "starts_at": { + "name": "Startar", + "description": "Start seinare i staden for no (opptil ei veke fram)" + }, + "name": { + "name": "Namn", + "description": "Valfri tekst på korta, t.d. «Gjester kl. 18»" + }, + "notify": { + "name": "Varsle", + "description": "Send boost-varselet til borna (når det varselet er på)" + } + } + }, + "end_boost": { + "name": "Avslutt eit boost", + "description": "Stopp eit boost tidleg, eller avlys eitt som ikkje har byrja.", + "fields": { + "boost_id": { + "name": "Boost-ID", + "description": "Boostet, frå attributtet boosts på sensor.taskmate_overview" + } + } } }, "entity": { @@ -1546,7 +1590,9 @@ "season_champion": "Sesongmeister", "bounty_posted": "Dusør lagd ut", "scheduled_change_applied": "Planlagd endring utført", - "raffle_drawn": "Loddtrekning trekt" + "raffle_drawn": "Loddtrekning trekt", + "boost_started": "Boost starta", + "boost_ended": "Boost slutt" } } } diff --git a/custom_components/taskmate/translations/pl.json b/custom_components/taskmate/translations/pl.json index cb911a4c..21282b10 100644 --- a/custom_components/taskmate/translations/pl.json +++ b/custom_components/taskmate/translations/pl.json @@ -1462,6 +1462,50 @@ "description": "Dziecko potwierdzające odbiór (zostaw puste, gdy oznacza rodzic)" } } + }, + "start_boost": { + "name": "Rozpocznij boost", + "description": "Otwiera okno boostu. Obowiązki wykonane w tym czasie są warte mnożnik. Zostaw chore_ids lub child_ids puste dla wszystkich.", + "fields": { + "multiplier": { + "name": "Mnożnik", + "description": "Ile są warte obowiązki, np. 2 to podwójnie (1,1 do 5)" + }, + "minutes": { + "name": "Minuty", + "description": "Jak długo trwa boost" + }, + "chore_ids": { + "name": "ID obowiązków", + "description": "Obowiązki objęte boostem (puste = wszystkie)" + }, + "child_ids": { + "name": "ID dzieci", + "description": "Dzieci objęte boostem (puste = wszystkie)" + }, + "starts_at": { + "name": "Początek", + "description": "Zacznij później zamiast teraz (do tygodnia naprzód)" + }, + "name": { + "name": "Nazwa", + "description": "Opcjonalna etykieta na kartach, np. „Goście o 18”" + }, + "notify": { + "name": "Powiadom", + "description": "Wyślij powiadomienie o boostcie dzieciom (gdy jest włączone)" + } + } + }, + "end_boost": { + "name": "Zakończ boost", + "description": "Zakończ boost wcześniej albo odwołaj taki, który jeszcze się nie zaczął.", + "fields": { + "boost_id": { + "name": "ID boostu", + "description": "Boost z atrybutu boosts w sensor.taskmate_overview" + } + } } }, "entity": { @@ -1546,7 +1590,9 @@ "season_champion": "Mistrz sezonu", "bounty_posted": "Ogłoszono nagrodę", "scheduled_change_applied": "Zastosowano zaplanowaną zmianę", - "raffle_drawn": "Rozlosowano" + "raffle_drawn": "Rozlosowano", + "boost_started": "Boost rozpoczęty", + "boost_ended": "Boost zakończony" } } } diff --git a/custom_components/taskmate/translations/pt-BR.json b/custom_components/taskmate/translations/pt-BR.json index d8e317f2..9a075f66 100644 --- a/custom_components/taskmate/translations/pt-BR.json +++ b/custom_components/taskmate/translations/pt-BR.json @@ -1462,6 +1462,50 @@ "description": "A criança que confirma ter recebido (deixe vazio quando um dos pais marca)" } } + }, + "start_boost": { + "name": "Iniciar um boost", + "description": "Abre uma janela de boost. As tarefas feitas nela valem o multiplicador. Deixe chore_ids ou child_ids vazios para todos.", + "fields": { + "multiplier": { + "name": "Multiplicador", + "description": "Quanto valem as tarefas, ex. 2 para o dobro (1,1 a 5)" + }, + "minutes": { + "name": "Minutos", + "description": "Quanto tempo dura o boost" + }, + "chore_ids": { + "name": "IDs das tarefas", + "description": "As tarefas incluídas (vazio = todas)" + }, + "child_ids": { + "name": "IDs das crianças", + "description": "As crianças incluídas (vazio = todas)" + }, + "starts_at": { + "name": "Começa às", + "description": "Começar mais tarde em vez de agora (até uma semana antes)" + }, + "name": { + "name": "Nome", + "description": "Rótulo opcional nos cards, ex. \"Visitas às seis\"" + }, + "notify": { + "name": "Notificar", + "description": "Enviar a notificação do boost às crianças (quando estiver ligada)" + } + } + }, + "end_boost": { + "name": "Encerrar um boost", + "description": "Parar um boost antes ou cancelar um que ainda não começou.", + "fields": { + "boost_id": { + "name": "ID do boost", + "description": "O boost, do atributo boosts de sensor.taskmate_overview" + } + } } }, "entity": { @@ -1546,7 +1590,9 @@ "season_champion": "Campeão da temporada", "bounty_posted": "Recompensa publicada", "scheduled_change_applied": "Alteração agendada aplicada", - "raffle_drawn": "Sorteio realizado" + "raffle_drawn": "Sorteio realizado", + "boost_started": "Boost iniciado", + "boost_ended": "Boost encerrado" } } } diff --git a/custom_components/taskmate/translations/pt.json b/custom_components/taskmate/translations/pt.json index 33e70701..8aef8edf 100644 --- a/custom_components/taskmate/translations/pt.json +++ b/custom_components/taskmate/translations/pt.json @@ -1462,6 +1462,50 @@ "description": "A criança que confirma ter recebido (deixar vazio quando é um dos pais a marcar)" } } + }, + "start_boost": { + "name": "Iniciar um boost", + "description": "Abre uma janela de boost. As tarefas feitas nela valem o multiplicador. Deixa chore_ids ou child_ids vazios para todos.", + "fields": { + "multiplier": { + "name": "Multiplicador", + "description": "Quanto valem as tarefas, p. ex. 2 para o dobro (1,1 a 5)" + }, + "minutes": { + "name": "Minutos", + "description": "Quanto tempo dura o boost" + }, + "chore_ids": { + "name": "IDs das tarefas", + "description": "As tarefas abrangidas (vazio = todas)" + }, + "child_ids": { + "name": "IDs das crianças", + "description": "As crianças abrangidas (vazio = todas)" + }, + "starts_at": { + "name": "Começa às", + "description": "Começar mais tarde em vez de agora (até uma semana antes)" + }, + "name": { + "name": "Nome", + "description": "Etiqueta opcional nos cartões, p. ex. \"Visitas às seis\"" + }, + "notify": { + "name": "Notificar", + "description": "Enviar a notificação do boost às crianças (quando estiver ligada)" + } + } + }, + "end_boost": { + "name": "Terminar um boost", + "description": "Parar um boost mais cedo ou cancelar um que ainda não começou.", + "fields": { + "boost_id": { + "name": "ID do boost", + "description": "O boost, do atributo boosts de sensor.taskmate_overview" + } + } } }, "entity": { @@ -1546,7 +1590,9 @@ "season_champion": "Campeão da temporada", "bounty_posted": "Recompensa publicada", "scheduled_change_applied": "Alteração agendada aplicada", - "raffle_drawn": "Sorteio realizado" + "raffle_drawn": "Sorteio realizado", + "boost_started": "Boost iniciado", + "boost_ended": "Boost terminado" } } } diff --git a/custom_components/taskmate/websocket.py b/custom_components/taskmate/websocket.py index 19b89425..5b9407f6 100644 --- a/custom_components/taskmate/websocket.py +++ b/custom_components/taskmate/websocket.py @@ -89,6 +89,7 @@ ) from .coord_auto_approve import AUTO_APPROVE_MAX_HOURS from .coord_birthdays import normalize_birthday +from .coord_boosts import BOOST_STACKING_MODES from .coord_inspections import INSPECTION_BONUS_MAX, INSPECTION_FAIL_MODES, INSPECTION_WINDOWS from .coord_pets import PET_BOOL_SETTINGS, PET_INT_SETTINGS from .coord_teamwork import teamwork_config_error @@ -497,6 +498,11 @@ def _build_state_snapshot(coordinator: TaskMateCoordinator) -> dict[str, Any]: "help_requests": coordinator.open_help_requests(), # Reward fulfilment (#1098): redeemed rewards still to be handed over. "owed_rewards": coordinator.owed_rewards(), + # Boost windows: live and upcoming boosts, the recurring rules, and + # the tablets the Settings page can offer to wake. + "boosts": coordinator.boosts_state(), + "boost_rules": [dict(r) for r in coordinator.boost_rules()], + "boost_wake_candidates": coordinator.boost_wake_candidates(), "sick_today": [c.id for c in coordinator.storage.get_children() if coordinator.is_sick_day(c.id)], "moods_today": {c.id: m for c in coordinator.storage.get_children() if (m := coordinator.mood_on(c.id))}, "raffles": coordinator.all_raffles(), @@ -1990,6 +1996,9 @@ async def _ws_remove_custom_sound(hass, connection, msg, coordinator): "weekly_goal_bonus", "reward_fulfilment_enabled", "reward_fulfilment_reminder_days", + "boost_stacking", + "boost_wake_screens", + "boost_wake_devices", "pets_enabled", *PET_INT_SETTINGS, *PET_BOOL_SETTINGS, @@ -2283,6 +2292,11 @@ def _validate_chore_undo_seconds(value: Any) -> int: **{vol.Optional(key): bool for key in PET_BOOL_SETTINGS}, vol.Optional("weekly_goal_bonus"): vol.All(vol.Coerce(int), vol.Range(min=0, max=100000)), vol.Optional("reward_fulfilment_enabled"): bool, + vol.Optional("boost_stacking"): vol.In(BOOST_STACKING_MODES), + vol.Optional("boost_wake_screens"): vol.All([vol.All(str, vol.Match(r"^switch\.[a-z0-9_]+$"))], vol.Length(max=10)), + vol.Optional("boost_wake_devices"): vol.All( + [vol.All(str, vol.Match(r"^mobile_app_[a-z0-9_]+$"))], vol.Length(max=10) + ), vol.Optional("reward_fulfilment_reminder_days"): vol.All( vol.Coerce(int), vol.Range(min=0, max=REWARD_FULFILMENT_REMINDER_MAX_DAYS) ), @@ -3362,6 +3376,7 @@ def async_register_websocket_commands(hass: HomeAssistant) -> None: # build on this module's _admin_only / _get_coordinator helpers. from .kiosk import KIOSK_COMMANDS from .websocket_auctions import AUCTION_COMMANDS + from .websocket_boosts import BOOST_COMMANDS from .websocket_inspections import INSPECTION_COMMANDS from .websocket_raffles import RAFFLE_COMMANDS from .websocket_recaps import RECAP_COMMANDS @@ -3374,6 +3389,7 @@ def async_register_websocket_commands(hass: HomeAssistant) -> None: *SETUP_COMMANDS, *AUCTION_COMMANDS, *RAFFLE_COMMANDS, + *BOOST_COMMANDS, ) for cmd in (*_COMMANDS, *extra): websocket_api.async_register_command(hass, cmd) diff --git a/custom_components/taskmate/websocket_boosts.py b/custom_components/taskmate/websocket_boosts.py new file mode 100644 index 00000000..891b449d --- /dev/null +++ b/custom_components/taskmate/websocket_boosts.py @@ -0,0 +1,65 @@ +"""WebSocket commands for boost windows — the admin panel's, admin-only like every panel command. + +Starting and ending a boost from the panel goes through the ``start_boost`` / +``end_boost`` services (parent gate), the same door automations use. These +commands cover what only the panel does: the recurring rules and a test wake +of the chosen tablets. +""" + +from __future__ import annotations + +import voluptuous as vol +from homeassistant.components import websocket_api + +from .coord_boosts import BOOST_MAX_MULTIPLIER, BOOST_MIN_MULTIPLIER, BOOST_NAME_MAX +from .websocket import _admin_only + +WS_BOOST_RULE_SAVE = "taskmate/boosts/save_rule" +WS_BOOST_RULE_DELETE = "taskmate/boosts/delete_rule" +WS_BOOST_TEST_WAKE = "taskmate/boosts/test_wake" + + +@websocket_api.websocket_command( + { + vol.Required("type"): WS_BOOST_RULE_SAVE, + vol.Optional("rule_id"): str, + vol.Optional("name", default=""): vol.All(str, vol.Length(max=BOOST_NAME_MAX)), + vol.Required("days"): vol.All([vol.All(vol.Coerce(int), vol.Range(min=0, max=6))], vol.Length(max=7)), + vol.Required("start"): vol.Match(r"^([01]\d|2[0-3]):[0-5]\d$"), + vol.Required("end"): vol.Match(r"^([01]\d|2[0-3]):[0-5]\d$"), + vol.Required("multiplier"): vol.All( + vol.Coerce(float), vol.Range(min=BOOST_MIN_MULTIPLIER, max=BOOST_MAX_MULTIPLIER) + ), + vol.Optional("chore_ids", default=[]): [str], + vol.Optional("child_ids", default=[]): [str], + vol.Optional("notify", default=True): bool, + vol.Optional("enabled", default=True): bool, + } +) +@websocket_api.async_response +@_admin_only +async def ws_boost_rule_save(hass, connection, msg, coordinator): + data = {k: v for k, v in msg.items() if k not in ("id", "type", "rule_id")} + if msg.get("rule_id"): + data["id"] = msg["rule_id"] + rule = await coordinator.async_save_boost_rule(data) + connection.send_result(msg["id"], {"rule": rule}) + + +@websocket_api.websocket_command({vol.Required("type"): WS_BOOST_RULE_DELETE, vol.Required("rule_id"): str}) +@websocket_api.async_response +@_admin_only +async def ws_boost_rule_delete(hass, connection, msg, coordinator): + await coordinator.async_delete_boost_rule(msg["rule_id"]) + connection.send_result(msg["id"], {}) + + +@websocket_api.websocket_command({vol.Required("type"): WS_BOOST_TEST_WAKE}) +@websocket_api.async_response +@_admin_only +async def ws_boost_test_wake(hass, connection, msg, coordinator): + sent = await coordinator.async_wake_boost_screens() + connection.send_result(msg["id"], {"sent": sent}) + + +BOOST_COMMANDS = (ws_boost_rule_save, ws_boost_rule_delete, ws_boost_test_wake) diff --git a/custom_components/taskmate/www/locales/da.json b/custom_components/taskmate/www/locales/da.json index 1beedc15..dd01c57d 100644 --- a/custom_components/taskmate/www/locales/da.json +++ b/custom_components/taskmate/www/locales/da.json @@ -3480,5 +3480,94 @@ "bests.record_best_day_points": "Bedste dag ({points_name})", "bests.record_best_day_chores": "Flest opgaver på en dag", "bests.record_best_week_points": "Bedste uge ({points_name})", - "bests.record_best_single_award": "Største belønning" + "bests.record_best_single_award": "Største belønning", + "notify.boost_started": "⚡ Boost! {chores_text} giver ×{multiplier} de næste {minutes} minutter.", + "notify.boost_all_chores": "Alle opgaver", + "notification.boost_started.name": "Boost startet", + "notification.boost_started.description": "Fortæller børnene, et boost gælder for, at det er begyndt, hvor stort det er, og hvor længe det varer.", + "child.boost_title": "Boost ×{multiplier}", + "child.boost_title_named": "Boost ×{multiplier} — {name}", + "child.boost_left": "tilbage", + "child.boost_next": "Næste boost: {time} · {what} ×{multiplier}", + "child.boost_all_chores": "Alle opgaver", + "child.boost_some_chores": "{first} og {count} mere", + "child.boost_takeover_title": "BOOST!", + "child.boost_takeover_all": "Alle opgaver giver ×{multiplier} de næste", + "child.boost_takeover_some": "giver ×{multiplier} de næste", + "child.boost_takeover_go": "Kom så! 🚀", + "child.editor.show_boost_alert": "Vis boost-besked, når et boost starter", + "kiosk.boost_title": "BOOST-TID!", + "kiosk.boost_sub": "{what} giver ×{multiplier} de næste", + "kiosk.boost_go": "Tryk for at starte! 🚀", + "kiosk.boost_strip": "Boost ×{multiplier} · {what}", + "kiosk.editor.show_boost_alert": "Fyld skærmen, når et boost starter", + "panel.boost_start": "Start et boost", + "panel.boost_card_title": "Boosts", + "panel.boost_live": "{count} aktive", + "panel.boost_ends": "slutter {time} ({minutes} min tilbage)", + "panel.boost_starts": "{start}–{end}", + "panel.boost_recurring": "gentages", + "panel.boost_end_now": "Stop nu", + "panel.boost_skip": "Spring over denne gang", + "panel.boost_call_off": "Aflys", + "panel.boost_all_chores": "Alle opgaver", + "panel.boost_n_chores": "{first} og {count} mere", + "panel.boost_everyone": "Alle", + "panel.boost_dialog_title": "Start et boost", + "panel.boost_when": "Hvornår", + "panel.boost_now": "Nu", + "panel.boost_later": "Senere i dag", + "panel.boost_pays": "Giver", + "panel.boost_for": "Varighed", + "panel.boost_minutes": "{count} min", + "panel.boost_hour": "1 time", + "panel.boost_hours": "{count} timer", + "panel.boost_which_chores": "Hvilke opgaver", + "panel.boost_who": "Hvem", + "panel.boost_name": "Navn (valgfrit)", + "panel.boost_name_ph": "Vises på kortene, f.eks. Gæster kl. 18", + "panel.boost_notify": "Giv børnene besked", + "panel.boost_notify_hint": "Besked på deres telefon, hvis beskeden Boost startet er slået til. Tablets vækkes uanset.", + "panel.boost_preview_now": "{what} giver ×{multiplier} for {who}, fra nu og {minutes} minutter frem (til {until}).", + "panel.boost_preview_later": "{what} giver ×{multiplier} for {who}, fra {time} i {minutes} minutter.", + "panel.boost_preview_rule": "Hver {days}, {start}–{end}: {what} giver ×{multiplier} for {who}.", + "panel.boost_later_invalid": "Vælg et senere tidspunkt i dag.", + "panel.boost_started": "Boost startet", + "panel.boost_scheduled": "Boost planlagt", + "panel.boost_ended": "Boost stoppet", + "panel.boost_settings_title": "Boost-vinduer", + "panel.boost_settings_hint": "Tidsbegrænsede multiplikatorer på valgte opgaver. Start et fra I dag, opret gentagne her, eller brug tjenesten taskmate.start_boost i en automatisering.", + "panel.boost_stacking": "I weekenden eller på en fødselsdag", + "panel.boost_stacking_hint": "De dage giver allerede en multiplikator. Vælg, hvordan et boost lægges oven i.", + "panel.boost_stacking_highest": "Den højeste gælder", + "panel.boost_stacking_highest_hint": "Et ×2-boost på en ×2-lørdag giver ×2. Den største gælder.", + "panel.boost_stacking_stack": "Læg dem sammen", + "panel.boost_stacking_stack_hint": "Et ×2-boost på en ×2-lørdag giver ×4.", + "panel.boost_wake_screens": "Væk disse tablets, når et boost starter", + "panel.boost_wake_screens_hint": "Fully Kiosk Browser: skærm tændt, pauseskærm slukket, browser forrest.", + "panel.boost_wake_screens_none": "Ingen Fully Kiosk-tablets fundet. Tilføj Fully Kiosk Browser-integrationen til Home Assistant for at vække en.", + "panel.boost_wake_devices": "Væk disse telefoner og tablets", + "panel.boost_wake_devices_hint": "Home Assistant Companion-appen på Android: sender command_screen_on.", + "panel.boost_wake_devices_none": "Ingen enheder med Companion-appen fundet.", + "panel.boost_companion_tag": "Companion-app", + "panel.boost_test_wake": "Test vækning nu", + "panel.boost_test_wake_hint": "Bruger de gemte valg. Gem først efter ændringer.", + "panel.boost_test_wake_sent": "Vækning sendt til {count} skærm(e)", + "panel.boost_rules": "Gentagne boosts", + "panel.boost_rules_hint": "Kører af sig selv. I dag viser hvert boost, før det starter.", + "panel.boost_rule_add": "Tilføj gentaget boost", + "panel.boost_rule_edit": "Rediger gentaget boost", + "panel.boost_rule_edit_btn": "Rediger", + "panel.boost_rule_delete": "Slet", + "panel.boost_rule_delete_confirm": "Slet dette gentagne boost?", + "panel.boost_rule_deleted": "Gentaget boost slettet", + "panel.boost_rule_saved": "Gentaget boost gemt", + "panel.boost_rule_need_day": "Vælg mindst én dag.", + "panel.boost_rule_bad_times": "Sluttidspunktet skal være efter starttidspunktet.", + "panel.boost_rule_on": "Til", + "panel.boost_rule_unnamed": "Boost", + "panel.boost_days": "Dage", + "panel.boost_from": "Fra", + "panel.boost_to": "Til", + "panel.boost_everyone_lc": "alle" } diff --git a/custom_components/taskmate/www/locales/de.json b/custom_components/taskmate/www/locales/de.json index e697ec13..89859026 100644 --- a/custom_components/taskmate/www/locales/de.json +++ b/custom_components/taskmate/www/locales/de.json @@ -3480,5 +3480,94 @@ "bests.record_best_day_points": "Bester Tag ({points_name})", "bests.record_best_day_chores": "Meiste Aufgaben an einem Tag", "bests.record_best_week_points": "Beste Woche ({points_name})", - "bests.record_best_single_award": "Größte Belohnung" + "bests.record_best_single_award": "Größte Belohnung", + "notify.boost_started": "⚡ Boost! {chores_text} zählen ×{multiplier} für die nächsten {minutes} Minuten.", + "notify.boost_all_chores": "Alle Aufgaben", + "notification.boost_started.name": "Boost gestartet", + "notification.boost_started.description": "Sagt den Kindern, für die ein Boost gilt, dass er begonnen hat, wie groß er ist und wie lange er dauert.", + "child.boost_title": "Boost ×{multiplier}", + "child.boost_title_named": "Boost ×{multiplier} – {name}", + "child.boost_left": "übrig", + "child.boost_next": "Nächster Boost: {time} · {what} ×{multiplier}", + "child.boost_all_chores": "Alle Aufgaben", + "child.boost_some_chores": "{first} und {count} weitere", + "child.boost_takeover_title": "BOOST!", + "child.boost_takeover_all": "Jede Aufgabe zählt ×{multiplier} für die nächsten", + "child.boost_takeover_some": "zählen ×{multiplier} für die nächsten", + "child.boost_takeover_go": "Los geht's! 🚀", + "child.editor.show_boost_alert": "Boost-Hinweis zeigen, wenn ein Boost startet", + "kiosk.boost_title": "BOOST-ZEIT!", + "kiosk.boost_sub": "{what} zählen ×{multiplier} für die nächsten", + "kiosk.boost_go": "Tippen zum Start! 🚀", + "kiosk.boost_strip": "Boost ×{multiplier} · {what}", + "kiosk.editor.show_boost_alert": "Bildschirm füllen, wenn ein Boost startet", + "panel.boost_start": "Boost starten", + "panel.boost_card_title": "Boosts", + "panel.boost_live": "{count} aktiv", + "panel.boost_ends": "endet {time} (noch {minutes} Min.)", + "panel.boost_starts": "{start}–{end}", + "panel.boost_recurring": "wiederkehrend", + "panel.boost_end_now": "Jetzt beenden", + "panel.boost_skip": "Diesmal auslassen", + "panel.boost_call_off": "Absagen", + "panel.boost_all_chores": "Alle Aufgaben", + "panel.boost_n_chores": "{first} und {count} weitere", + "panel.boost_everyone": "Alle", + "panel.boost_dialog_title": "Boost starten", + "panel.boost_when": "Wann", + "panel.boost_now": "Jetzt", + "panel.boost_later": "Später heute", + "panel.boost_pays": "Zählt", + "panel.boost_for": "Dauer", + "panel.boost_minutes": "{count} Min.", + "panel.boost_hour": "1 Stunde", + "panel.boost_hours": "{count} Stunden", + "panel.boost_which_chores": "Welche Aufgaben", + "panel.boost_who": "Wer", + "panel.boost_name": "Name (optional)", + "panel.boost_name_ph": "Steht auf den Karten, z. B. Besuch um sechs", + "panel.boost_notify": "Kinder benachrichtigen", + "panel.boost_notify_hint": "Push aufs Handy, wenn die Benachrichtigung „Boost gestartet“ an ist. Tablets werden so oder so geweckt.", + "panel.boost_preview_now": "{what} zählen ×{multiplier} für {who}, ab jetzt, {minutes} Minuten lang (bis {until}).", + "panel.boost_preview_later": "{what} zählen ×{multiplier} für {who}, ab {time} für {minutes} Minuten.", + "panel.boost_preview_rule": "Jeden {days}, {start}–{end}: {what} zählen ×{multiplier} für {who}.", + "panel.boost_later_invalid": "Wähle eine spätere Uhrzeit heute.", + "panel.boost_started": "Boost gestartet", + "panel.boost_scheduled": "Boost geplant", + "panel.boost_ended": "Boost beendet", + "panel.boost_settings_title": "Boost-Fenster", + "panel.boost_settings_hint": "Zeitlich begrenzte Multiplikatoren für ausgewählte Aufgaben. Starte einen über Heute, lege wiederkehrende hier an oder nutze den Dienst taskmate.start_boost in einer Automatisierung.", + "panel.boost_stacking": "Am Wochenende oder Geburtstag", + "panel.boost_stacking_hint": "An diesen Tagen gibt es schon einen Multiplikator. Wähle, wie ein Boost damit zusammenwirkt.", + "panel.boost_stacking_highest": "Der höhere gilt", + "panel.boost_stacking_highest_hint": "Ein ×2-Boost an einem ×2-Samstag zählt ×2. Der größere gilt.", + "panel.boost_stacking_stack": "Zusammenrechnen", + "panel.boost_stacking_stack_hint": "Ein ×2-Boost an einem ×2-Samstag zählt ×4.", + "panel.boost_wake_screens": "Diese Tablets wecken, wenn ein Boost startet", + "panel.boost_wake_screens_hint": "Fully Kiosk Browser: Bildschirm an, Bildschirmschoner aus, Browser nach vorne.", + "panel.boost_wake_screens_none": "Keine Fully-Kiosk-Tablets gefunden. Füge die Fully-Kiosk-Browser-Integration zu Home Assistant hinzu, um eines zu wecken.", + "panel.boost_wake_devices": "Diese Handys und Tablets wecken", + "panel.boost_wake_devices_hint": "Home Assistant Companion-App auf Android: sendet command_screen_on.", + "panel.boost_wake_devices_none": "Keine Geräte mit Companion-App gefunden.", + "panel.boost_companion_tag": "Companion-App", + "panel.boost_test_wake": "Jetzt testweise wecken", + "panel.boost_test_wake_hint": "Nutzt die gespeicherte Auswahl. Nach Änderungen zuerst speichern.", + "panel.boost_test_wake_sent": "Weckruf an {count} Bildschirm(e) gesendet", + "panel.boost_rules": "Wiederkehrende Boosts", + "panel.boost_rules_hint": "Laufen von selbst. Heute zeigt jeden vor dem Start an.", + "panel.boost_rule_add": "Wiederkehrenden Boost hinzufügen", + "panel.boost_rule_edit": "Wiederkehrenden Boost bearbeiten", + "panel.boost_rule_edit_btn": "Bearbeiten", + "panel.boost_rule_delete": "Löschen", + "panel.boost_rule_delete_confirm": "Diesen wiederkehrenden Boost löschen?", + "panel.boost_rule_deleted": "Wiederkehrender Boost gelöscht", + "panel.boost_rule_saved": "Wiederkehrender Boost gespeichert", + "panel.boost_rule_need_day": "Wähle mindestens einen Tag.", + "panel.boost_rule_bad_times": "Die Endzeit muss nach der Startzeit liegen.", + "panel.boost_rule_on": "An", + "panel.boost_rule_unnamed": "Boost", + "panel.boost_days": "Tage", + "panel.boost_from": "Von", + "panel.boost_to": "Bis", + "panel.boost_everyone_lc": "alle" } diff --git a/custom_components/taskmate/www/locales/en-GB.json b/custom_components/taskmate/www/locales/en-GB.json index b8475062..9833c117 100644 --- a/custom_components/taskmate/www/locales/en-GB.json +++ b/custom_components/taskmate/www/locales/en-GB.json @@ -3480,5 +3480,94 @@ "bests.record_best_day_points": "Best day ({points_name})", "bests.record_best_day_chores": "Most chores in a day", "bests.record_best_week_points": "Best week ({points_name})", - "bests.record_best_single_award": "Biggest award" + "bests.record_best_single_award": "Biggest award", + "notify.boost_started": "⚡ Boost! {chores_text} pay ×{multiplier} for the next {minutes} minutes.", + "notify.boost_all_chores": "All chores", + "notification.boost_started.name": "Boost started", + "notification.boost_started.description": "Tells the children a boost covers that it has begun, how big it is and how long it lasts.", + "child.boost_title": "Boost ×{multiplier}", + "child.boost_title_named": "Boost ×{multiplier} — {name}", + "child.boost_left": "left", + "child.boost_next": "Next boost: {time} · {what} ×{multiplier}", + "child.boost_all_chores": "All chores", + "child.boost_some_chores": "{first} and {count} more", + "child.boost_takeover_title": "BOOST!", + "child.boost_takeover_all": "Every chore pays ×{multiplier} for the next", + "child.boost_takeover_some": "pay ×{multiplier} for the next", + "child.boost_takeover_go": "Let's go! 🚀", + "child.editor.show_boost_alert": "Show the boost alert when a boost starts", + "kiosk.boost_title": "BOOST TIME!", + "kiosk.boost_sub": "{what} pay ×{multiplier} for the next", + "kiosk.boost_go": "Tap to start! 🚀", + "kiosk.boost_strip": "Boost ×{multiplier} · {what}", + "kiosk.editor.show_boost_alert": "Fill the screen when a boost starts", + "panel.boost_start": "Start a boost", + "panel.boost_card_title": "Boosts", + "panel.boost_live": "{count} live", + "panel.boost_ends": "ends {time} ({minutes} min left)", + "panel.boost_starts": "{start}–{end}", + "panel.boost_recurring": "recurring", + "panel.boost_end_now": "End now", + "panel.boost_skip": "Skip this one", + "panel.boost_call_off": "Call off", + "panel.boost_all_chores": "All chores", + "panel.boost_n_chores": "{first} and {count} more", + "panel.boost_everyone": "Everyone", + "panel.boost_dialog_title": "Start a boost", + "panel.boost_when": "When", + "panel.boost_now": "Now", + "panel.boost_later": "Later today", + "panel.boost_pays": "Pays", + "panel.boost_for": "For", + "panel.boost_minutes": "{count} min", + "panel.boost_hour": "1 hour", + "panel.boost_hours": "{count} hours", + "panel.boost_which_chores": "Which chores", + "panel.boost_who": "Who", + "panel.boost_name": "Name (optional)", + "panel.boost_name_ph": "Shown on the cards, e.g. Guests at six", + "panel.boost_notify": "Tell the children", + "panel.boost_notify_hint": "Push to their phones, if the Boost started notification is on. Tablets wake either way.", + "panel.boost_preview_now": "{what} pay ×{multiplier} for {who}, starting now, for {minutes} minutes (until {until}).", + "panel.boost_preview_later": "{what} pay ×{multiplier} for {who}, from {time} for {minutes} minutes.", + "panel.boost_preview_rule": "Every {days}, {start}–{end}: {what} pay ×{multiplier} for {who}.", + "panel.boost_later_invalid": "Pick a time later today.", + "panel.boost_started": "Boost started", + "panel.boost_scheduled": "Boost scheduled", + "panel.boost_ended": "Boost ended", + "panel.boost_settings_title": "Boost windows", + "panel.boost_settings_hint": "Time-boxed multipliers on chosen chores. Start one from Today, set recurring ones here, or use the taskmate.start_boost service in an automation.", + "panel.boost_stacking": "On the weekend or a birthday", + "panel.boost_stacking_hint": "Those days already pay a multiplier. Pick how a boost combines with it.", + "panel.boost_stacking_highest": "Highest wins", + "panel.boost_stacking_highest_hint": "A ×2 boost on a ×2 Saturday pays ×2. The bigger one applies.", + "panel.boost_stacking_stack": "Stack them", + "panel.boost_stacking_stack_hint": "A ×2 boost on a ×2 Saturday pays ×4.", + "panel.boost_wake_screens": "Wake these tablets when a boost starts", + "panel.boost_wake_screens_hint": "Fully Kiosk Browser: screen on, screensaver off, browser to the front.", + "panel.boost_wake_screens_none": "No Fully Kiosk Browser tablets found. Add the Fully Kiosk Browser integration to Home Assistant to wake one.", + "panel.boost_wake_devices": "Wake these phones and tablets", + "panel.boost_wake_devices_hint": "Home Assistant Companion app on Android: sends command_screen_on.", + "panel.boost_wake_devices_none": "No Companion app devices found.", + "panel.boost_companion_tag": "Companion app", + "panel.boost_test_wake": "Test wake now", + "panel.boost_test_wake_hint": "Uses the saved choices. Save first after changing them.", + "panel.boost_test_wake_sent": "Wake sent to {count} screen(s)", + "panel.boost_rules": "Recurring boosts", + "panel.boost_rules_hint": "Repeat on their own. Today shows each one before it starts.", + "panel.boost_rule_add": "Add a recurring boost", + "panel.boost_rule_edit": "Edit recurring boost", + "panel.boost_rule_edit_btn": "Edit", + "panel.boost_rule_delete": "Delete", + "panel.boost_rule_delete_confirm": "Delete this recurring boost?", + "panel.boost_rule_deleted": "Recurring boost deleted", + "panel.boost_rule_saved": "Recurring boost saved", + "panel.boost_rule_need_day": "Pick at least one day.", + "panel.boost_rule_bad_times": "The end time must be after the start time.", + "panel.boost_rule_on": "On", + "panel.boost_rule_unnamed": "Boost", + "panel.boost_days": "Days", + "panel.boost_from": "From", + "panel.boost_to": "To", + "panel.boost_everyone_lc": "everyone" } diff --git a/custom_components/taskmate/www/locales/en.json b/custom_components/taskmate/www/locales/en.json index b8475062..9833c117 100644 --- a/custom_components/taskmate/www/locales/en.json +++ b/custom_components/taskmate/www/locales/en.json @@ -3480,5 +3480,94 @@ "bests.record_best_day_points": "Best day ({points_name})", "bests.record_best_day_chores": "Most chores in a day", "bests.record_best_week_points": "Best week ({points_name})", - "bests.record_best_single_award": "Biggest award" + "bests.record_best_single_award": "Biggest award", + "notify.boost_started": "⚡ Boost! {chores_text} pay ×{multiplier} for the next {minutes} minutes.", + "notify.boost_all_chores": "All chores", + "notification.boost_started.name": "Boost started", + "notification.boost_started.description": "Tells the children a boost covers that it has begun, how big it is and how long it lasts.", + "child.boost_title": "Boost ×{multiplier}", + "child.boost_title_named": "Boost ×{multiplier} — {name}", + "child.boost_left": "left", + "child.boost_next": "Next boost: {time} · {what} ×{multiplier}", + "child.boost_all_chores": "All chores", + "child.boost_some_chores": "{first} and {count} more", + "child.boost_takeover_title": "BOOST!", + "child.boost_takeover_all": "Every chore pays ×{multiplier} for the next", + "child.boost_takeover_some": "pay ×{multiplier} for the next", + "child.boost_takeover_go": "Let's go! 🚀", + "child.editor.show_boost_alert": "Show the boost alert when a boost starts", + "kiosk.boost_title": "BOOST TIME!", + "kiosk.boost_sub": "{what} pay ×{multiplier} for the next", + "kiosk.boost_go": "Tap to start! 🚀", + "kiosk.boost_strip": "Boost ×{multiplier} · {what}", + "kiosk.editor.show_boost_alert": "Fill the screen when a boost starts", + "panel.boost_start": "Start a boost", + "panel.boost_card_title": "Boosts", + "panel.boost_live": "{count} live", + "panel.boost_ends": "ends {time} ({minutes} min left)", + "panel.boost_starts": "{start}–{end}", + "panel.boost_recurring": "recurring", + "panel.boost_end_now": "End now", + "panel.boost_skip": "Skip this one", + "panel.boost_call_off": "Call off", + "panel.boost_all_chores": "All chores", + "panel.boost_n_chores": "{first} and {count} more", + "panel.boost_everyone": "Everyone", + "panel.boost_dialog_title": "Start a boost", + "panel.boost_when": "When", + "panel.boost_now": "Now", + "panel.boost_later": "Later today", + "panel.boost_pays": "Pays", + "panel.boost_for": "For", + "panel.boost_minutes": "{count} min", + "panel.boost_hour": "1 hour", + "panel.boost_hours": "{count} hours", + "panel.boost_which_chores": "Which chores", + "panel.boost_who": "Who", + "panel.boost_name": "Name (optional)", + "panel.boost_name_ph": "Shown on the cards, e.g. Guests at six", + "panel.boost_notify": "Tell the children", + "panel.boost_notify_hint": "Push to their phones, if the Boost started notification is on. Tablets wake either way.", + "panel.boost_preview_now": "{what} pay ×{multiplier} for {who}, starting now, for {minutes} minutes (until {until}).", + "panel.boost_preview_later": "{what} pay ×{multiplier} for {who}, from {time} for {minutes} minutes.", + "panel.boost_preview_rule": "Every {days}, {start}–{end}: {what} pay ×{multiplier} for {who}.", + "panel.boost_later_invalid": "Pick a time later today.", + "panel.boost_started": "Boost started", + "panel.boost_scheduled": "Boost scheduled", + "panel.boost_ended": "Boost ended", + "panel.boost_settings_title": "Boost windows", + "panel.boost_settings_hint": "Time-boxed multipliers on chosen chores. Start one from Today, set recurring ones here, or use the taskmate.start_boost service in an automation.", + "panel.boost_stacking": "On the weekend or a birthday", + "panel.boost_stacking_hint": "Those days already pay a multiplier. Pick how a boost combines with it.", + "panel.boost_stacking_highest": "Highest wins", + "panel.boost_stacking_highest_hint": "A ×2 boost on a ×2 Saturday pays ×2. The bigger one applies.", + "panel.boost_stacking_stack": "Stack them", + "panel.boost_stacking_stack_hint": "A ×2 boost on a ×2 Saturday pays ×4.", + "panel.boost_wake_screens": "Wake these tablets when a boost starts", + "panel.boost_wake_screens_hint": "Fully Kiosk Browser: screen on, screensaver off, browser to the front.", + "panel.boost_wake_screens_none": "No Fully Kiosk Browser tablets found. Add the Fully Kiosk Browser integration to Home Assistant to wake one.", + "panel.boost_wake_devices": "Wake these phones and tablets", + "panel.boost_wake_devices_hint": "Home Assistant Companion app on Android: sends command_screen_on.", + "panel.boost_wake_devices_none": "No Companion app devices found.", + "panel.boost_companion_tag": "Companion app", + "panel.boost_test_wake": "Test wake now", + "panel.boost_test_wake_hint": "Uses the saved choices. Save first after changing them.", + "panel.boost_test_wake_sent": "Wake sent to {count} screen(s)", + "panel.boost_rules": "Recurring boosts", + "panel.boost_rules_hint": "Repeat on their own. Today shows each one before it starts.", + "panel.boost_rule_add": "Add a recurring boost", + "panel.boost_rule_edit": "Edit recurring boost", + "panel.boost_rule_edit_btn": "Edit", + "panel.boost_rule_delete": "Delete", + "panel.boost_rule_delete_confirm": "Delete this recurring boost?", + "panel.boost_rule_deleted": "Recurring boost deleted", + "panel.boost_rule_saved": "Recurring boost saved", + "panel.boost_rule_need_day": "Pick at least one day.", + "panel.boost_rule_bad_times": "The end time must be after the start time.", + "panel.boost_rule_on": "On", + "panel.boost_rule_unnamed": "Boost", + "panel.boost_days": "Days", + "panel.boost_from": "From", + "panel.boost_to": "To", + "panel.boost_everyone_lc": "everyone" } diff --git a/custom_components/taskmate/www/locales/fr.json b/custom_components/taskmate/www/locales/fr.json index c9a112ed..f01ea028 100644 --- a/custom_components/taskmate/www/locales/fr.json +++ b/custom_components/taskmate/www/locales/fr.json @@ -3480,5 +3480,94 @@ "bests.record_best_day_points": "Meilleure journée ({points_name})", "bests.record_best_day_chores": "Le plus de tâches en un jour", "bests.record_best_week_points": "Meilleure semaine ({points_name})", - "bests.record_best_single_award": "Plus gros gain" + "bests.record_best_single_award": "Plus gros gain", + "notify.boost_started": "⚡ Boost ! {chores_text} rapportent ×{multiplier} pendant les {minutes} prochaines minutes.", + "notify.boost_all_chores": "Toutes les tâches", + "notification.boost_started.name": "Boost lancé", + "notification.boost_started.description": "Prévient les enfants concernés qu’un boost a commencé, sa taille et sa durée.", + "child.boost_title": "Boost ×{multiplier}", + "child.boost_title_named": "Boost ×{multiplier} — {name}", + "child.boost_left": "restant", + "child.boost_next": "Prochain boost : {time} · {what} ×{multiplier}", + "child.boost_all_chores": "Toutes les tâches", + "child.boost_some_chores": "{first} et {count} de plus", + "child.boost_takeover_title": "BOOST !", + "child.boost_takeover_all": "Chaque tâche rapporte ×{multiplier} pendant les prochaines", + "child.boost_takeover_some": "rapportent ×{multiplier} pendant les prochaines", + "child.boost_takeover_go": "C'est parti ! 🚀", + "child.editor.show_boost_alert": "Afficher l’alerte quand un boost commence", + "kiosk.boost_title": "C’EST LE BOOST !", + "kiosk.boost_sub": "{what} rapportent ×{multiplier} pendant les prochaines", + "kiosk.boost_go": "Touchez pour commencer ! 🚀", + "kiosk.boost_strip": "Boost ×{multiplier} · {what}", + "kiosk.editor.show_boost_alert": "Remplir l’écran quand un boost commence", + "panel.boost_start": "Lancer un boost", + "panel.boost_card_title": "Boosts", + "panel.boost_live": "{count} en cours", + "panel.boost_ends": "se termine à {time} (encore {minutes} min)", + "panel.boost_starts": "{start}–{end}", + "panel.boost_recurring": "récurrent", + "panel.boost_end_now": "Terminer", + "panel.boost_skip": "Sauter cette fois", + "panel.boost_call_off": "Annuler", + "panel.boost_all_chores": "Toutes les tâches", + "panel.boost_n_chores": "{first} et {count} de plus", + "panel.boost_everyone": "Tout le monde", + "panel.boost_dialog_title": "Lancer un boost", + "panel.boost_when": "Quand", + "panel.boost_now": "Maintenant", + "panel.boost_later": "Plus tard aujourd’hui", + "panel.boost_pays": "Rapporte", + "panel.boost_for": "Durée", + "panel.boost_minutes": "{count} min", + "panel.boost_hour": "1 heure", + "panel.boost_hours": "{count} heures", + "panel.boost_which_chores": "Quelles tâches", + "panel.boost_who": "Qui", + "panel.boost_name": "Nom (facultatif)", + "panel.boost_name_ph": "Affiché sur les cartes, p. ex. Invités à 18 h", + "panel.boost_notify": "Prévenir les enfants", + "panel.boost_notify_hint": "Notification sur leur téléphone si « Boost lancé » est activée. Les tablettes se réveillent dans tous les cas.", + "panel.boost_preview_now": "{what} rapportent ×{multiplier} pour {who}, dès maintenant, pendant {minutes} minutes (jusqu’à {until}).", + "panel.boost_preview_later": "{what} rapportent ×{multiplier} pour {who}, à partir de {time} pendant {minutes} minutes.", + "panel.boost_preview_rule": "Chaque {days}, {start}–{end} : {what} rapportent ×{multiplier} pour {who}.", + "panel.boost_later_invalid": "Choisissez une heure plus tard aujourd’hui.", + "panel.boost_started": "Boost lancé", + "panel.boost_scheduled": "Boost programmé", + "panel.boost_ended": "Boost terminé", + "panel.boost_settings_title": "Fenêtres de boost", + "panel.boost_settings_hint": "Des multiplicateurs limités dans le temps sur certaines tâches. Lancez-en un depuis Aujourd’hui, créez des boosts récurrents ici ou utilisez le service taskmate.start_boost dans une automatisation.", + "panel.boost_stacking": "Le week-end ou un anniversaire", + "panel.boost_stacking_hint": "Ces jours ont déjà un multiplicateur. Choisissez comment un boost s’y ajoute.", + "panel.boost_stacking_highest": "Le plus grand l’emporte", + "panel.boost_stacking_highest_hint": "Un boost ×2 un samedi ×2 rapporte ×2. Le plus grand s’applique.", + "panel.boost_stacking_stack": "Les cumuler", + "panel.boost_stacking_stack_hint": "Un boost ×2 un samedi ×2 rapporte ×4.", + "panel.boost_wake_screens": "Réveiller ces tablettes quand un boost commence", + "panel.boost_wake_screens_hint": "Fully Kiosk Browser : écran allumé, économiseur coupé, navigateur au premier plan.", + "panel.boost_wake_screens_none": "Aucune tablette Fully Kiosk trouvée. Ajoutez l’intégration Fully Kiosk Browser à Home Assistant pour en réveiller une.", + "panel.boost_wake_devices": "Réveiller ces téléphones et tablettes", + "panel.boost_wake_devices_hint": "Application Companion Home Assistant sur Android : envoie command_screen_on.", + "panel.boost_wake_devices_none": "Aucun appareil avec l’application Companion trouvé.", + "panel.boost_companion_tag": "App Companion", + "panel.boost_test_wake": "Tester le réveil", + "panel.boost_test_wake_hint": "Utilise les choix enregistrés. Enregistrez d’abord après une modification.", + "panel.boost_test_wake_sent": "Réveil envoyé à {count} écran(s)", + "panel.boost_rules": "Boosts récurrents", + "panel.boost_rules_hint": "Se répètent tout seuls. Aujourd’hui les affiche avant qu’ils commencent.", + "panel.boost_rule_add": "Ajouter un boost récurrent", + "panel.boost_rule_edit": "Modifier le boost récurrent", + "panel.boost_rule_edit_btn": "Modifier", + "panel.boost_rule_delete": "Supprimer", + "panel.boost_rule_delete_confirm": "Supprimer ce boost récurrent ?", + "panel.boost_rule_deleted": "Boost récurrent supprimé", + "panel.boost_rule_saved": "Boost récurrent enregistré", + "panel.boost_rule_need_day": "Choisissez au moins un jour.", + "panel.boost_rule_bad_times": "L’heure de fin doit être après l’heure de début.", + "panel.boost_rule_on": "Activé", + "panel.boost_rule_unnamed": "Boost", + "panel.boost_days": "Jours", + "panel.boost_from": "De", + "panel.boost_to": "À", + "panel.boost_everyone_lc": "tout le monde" } diff --git a/custom_components/taskmate/www/locales/nb.json b/custom_components/taskmate/www/locales/nb.json index ffaa5570..3f21f977 100644 --- a/custom_components/taskmate/www/locales/nb.json +++ b/custom_components/taskmate/www/locales/nb.json @@ -3480,5 +3480,94 @@ "bests.record_best_day_points": "Beste dag ({points_name})", "bests.record_best_day_chores": "Flest oppgaver på én dag", "bests.record_best_week_points": "Beste uke ({points_name})", - "bests.record_best_single_award": "Største belønning" + "bests.record_best_single_award": "Største belønning", + "notify.boost_started": "⚡ Boost! {chores_text} gir ×{multiplier} de neste {minutes} minuttene.", + "notify.boost_all_chores": "Alle oppgaver", + "notification.boost_started.name": "Boost startet", + "notification.boost_started.description": "Forteller barna et boost gjelder for at det har begynt, hvor stort det er og hvor lenge det varer.", + "child.boost_title": "Boost ×{multiplier}", + "child.boost_title_named": "Boost ×{multiplier} – {name}", + "child.boost_left": "igjen", + "child.boost_next": "Neste boost: {time} · {what} ×{multiplier}", + "child.boost_all_chores": "Alle oppgaver", + "child.boost_some_chores": "{first} og {count} til", + "child.boost_takeover_title": "BOOST!", + "child.boost_takeover_all": "Alle oppgaver gir ×{multiplier} de neste", + "child.boost_takeover_some": "gir ×{multiplier} de neste", + "child.boost_takeover_go": "Kjør på! 🚀", + "child.editor.show_boost_alert": "Vis boost-varsel når et boost starter", + "kiosk.boost_title": "BOOST-TID!", + "kiosk.boost_sub": "{what} gir ×{multiplier} de neste", + "kiosk.boost_go": "Trykk for å starte! 🚀", + "kiosk.boost_strip": "Boost ×{multiplier} · {what}", + "kiosk.editor.show_boost_alert": "Fyll skjermen når et boost starter", + "panel.boost_start": "Start et boost", + "panel.boost_card_title": "Boost", + "panel.boost_live": "{count} aktive", + "panel.boost_ends": "slutter {time} ({minutes} min igjen)", + "panel.boost_starts": "{start}–{end}", + "panel.boost_recurring": "gjentas", + "panel.boost_end_now": "Avslutt nå", + "panel.boost_skip": "Hopp over denne gangen", + "panel.boost_call_off": "Avlys", + "panel.boost_all_chores": "Alle oppgaver", + "panel.boost_n_chores": "{first} og {count} til", + "panel.boost_everyone": "Alle", + "panel.boost_dialog_title": "Start et boost", + "panel.boost_when": "Når", + "panel.boost_now": "Nå", + "panel.boost_later": "Senere i dag", + "panel.boost_pays": "Gir", + "panel.boost_for": "Varighet", + "panel.boost_minutes": "{count} min", + "panel.boost_hour": "1 time", + "panel.boost_hours": "{count} timer", + "panel.boost_which_chores": "Hvilke oppgaver", + "panel.boost_who": "Hvem", + "panel.boost_name": "Navn (valgfritt)", + "panel.boost_name_ph": "Vises på kortene, f.eks. Gjester kl. 18", + "panel.boost_notify": "Gi barna beskjed", + "panel.boost_notify_hint": "Varsel på telefonen hvis varselet Boost startet er på. Nettbrett vekkes uansett.", + "panel.boost_preview_now": "{what} gir ×{multiplier} for {who}, fra nå i {minutes} minutter (til {until}).", + "panel.boost_preview_later": "{what} gir ×{multiplier} for {who}, fra {time} i {minutes} minutter.", + "panel.boost_preview_rule": "Hver {days}, {start}–{end}: {what} gir ×{multiplier} for {who}.", + "panel.boost_later_invalid": "Velg et senere tidspunkt i dag.", + "panel.boost_started": "Boost startet", + "panel.boost_scheduled": "Boost planlagt", + "panel.boost_ended": "Boost avsluttet", + "panel.boost_settings_title": "Boost-vinduer", + "panel.boost_settings_hint": "Tidsbegrensede multiplikatorer på valgte oppgaver. Start et fra I dag, lag gjentatte her, eller bruk tjenesten taskmate.start_boost i en automasjon.", + "panel.boost_stacking": "I helgen eller på bursdager", + "panel.boost_stacking_hint": "Disse dagene gir allerede en multiplikator. Velg hvordan et boost kombineres med den.", + "panel.boost_stacking_highest": "Den høyeste gjelder", + "panel.boost_stacking_highest_hint": "Et ×2-boost på en ×2-lørdag gir ×2. Den største gjelder.", + "panel.boost_stacking_stack": "Legg dem sammen", + "panel.boost_stacking_stack_hint": "Et ×2-boost på en ×2-lørdag gir ×4.", + "panel.boost_wake_screens": "Vekk disse nettbrettene når et boost starter", + "panel.boost_wake_screens_hint": "Fully Kiosk Browser: skjerm på, skjermsparer av, nettleser foran.", + "panel.boost_wake_screens_none": "Fant ingen Fully Kiosk-nettbrett. Legg til Fully Kiosk Browser-integrasjonen i Home Assistant for å vekke et.", + "panel.boost_wake_devices": "Vekk disse telefonene og nettbrettene", + "panel.boost_wake_devices_hint": "Home Assistant Companion-appen på Android: sender command_screen_on.", + "panel.boost_wake_devices_none": "Fant ingen enheter med Companion-appen.", + "panel.boost_companion_tag": "Companion-app", + "panel.boost_test_wake": "Test vekking nå", + "panel.boost_test_wake_hint": "Bruker de lagrede valgene. Lagre først etter endringer.", + "panel.boost_test_wake_sent": "Vekking sendt til {count} skjerm(er)", + "panel.boost_rules": "Gjentatte boost", + "panel.boost_rules_hint": "Går av seg selv. I dag viser hvert av dem før det starter.", + "panel.boost_rule_add": "Legg til gjentatt boost", + "panel.boost_rule_edit": "Rediger gjentatt boost", + "panel.boost_rule_edit_btn": "Rediger", + "panel.boost_rule_delete": "Slett", + "panel.boost_rule_delete_confirm": "Slette dette gjentatte boostet?", + "panel.boost_rule_deleted": "Gjentatt boost slettet", + "panel.boost_rule_saved": "Gjentatt boost lagret", + "panel.boost_rule_need_day": "Velg minst én dag.", + "panel.boost_rule_bad_times": "Sluttiden må være etter starttiden.", + "panel.boost_rule_on": "På", + "panel.boost_rule_unnamed": "Boost", + "panel.boost_days": "Dager", + "panel.boost_from": "Fra", + "panel.boost_to": "Til", + "panel.boost_everyone_lc": "alle" } diff --git a/custom_components/taskmate/www/locales/nl.json b/custom_components/taskmate/www/locales/nl.json index dd188c36..ed27d59d 100644 --- a/custom_components/taskmate/www/locales/nl.json +++ b/custom_components/taskmate/www/locales/nl.json @@ -3480,5 +3480,94 @@ "bests.record_best_day_points": "Beste dag ({points_name})", "bests.record_best_day_chores": "Meeste taken op één dag", "bests.record_best_week_points": "Beste week ({points_name})", - "bests.record_best_single_award": "Grootste beloning" + "bests.record_best_single_award": "Grootste beloning", + "notify.boost_started": "⚡ Boost! {chores_text} leveren ×{multiplier} op, de komende {minutes} minuten.", + "notify.boost_all_chores": "Alle taken", + "notification.boost_started.name": "Boost gestart", + "notification.boost_started.description": "Vertelt de kinderen voor wie een boost geldt dat hij begonnen is, hoe groot hij is en hoe lang hij duurt.", + "child.boost_title": "Boost ×{multiplier}", + "child.boost_title_named": "Boost ×{multiplier} — {name}", + "child.boost_left": "over", + "child.boost_next": "Volgende boost: {time} · {what} ×{multiplier}", + "child.boost_all_chores": "Alle taken", + "child.boost_some_chores": "{first} en nog {count}", + "child.boost_takeover_title": "BOOST!", + "child.boost_takeover_all": "Elke taak levert ×{multiplier} op, de komende", + "child.boost_takeover_some": "leveren ×{multiplier} op, de komende", + "child.boost_takeover_go": "Aan de slag! 🚀", + "child.editor.show_boost_alert": "Boostmelding tonen als een boost begint", + "kiosk.boost_title": "BOOSTTIJD!", + "kiosk.boost_sub": "{what} leveren ×{multiplier} op, de komende", + "kiosk.boost_go": "Tik om te beginnen! 🚀", + "kiosk.boost_strip": "Boost ×{multiplier} · {what}", + "kiosk.editor.show_boost_alert": "Volledig scherm tonen als een boost begint", + "panel.boost_start": "Boost starten", + "panel.boost_card_title": "Boosts", + "panel.boost_live": "{count} actief", + "panel.boost_ends": "eindigt om {time} (nog {minutes} min)", + "panel.boost_starts": "{start}–{end}", + "panel.boost_recurring": "terugkerend", + "panel.boost_end_now": "Nu stoppen", + "panel.boost_skip": "Deze overslaan", + "panel.boost_call_off": "Annuleren", + "panel.boost_all_chores": "Alle taken", + "panel.boost_n_chores": "{first} en nog {count}", + "panel.boost_everyone": "Iedereen", + "panel.boost_dialog_title": "Boost starten", + "panel.boost_when": "Wanneer", + "panel.boost_now": "Nu", + "panel.boost_later": "Later vandaag", + "panel.boost_pays": "Levert op", + "panel.boost_for": "Duur", + "panel.boost_minutes": "{count} min", + "panel.boost_hour": "1 uur", + "panel.boost_hours": "{count} uur", + "panel.boost_which_chores": "Welke taken", + "panel.boost_who": "Wie", + "panel.boost_name": "Naam (optioneel)", + "panel.boost_name_ph": "Zichtbaar op de kaarten, bijv. Om zes uur visite", + "panel.boost_notify": "De kinderen laten weten", + "panel.boost_notify_hint": "Melding naar hun telefoon, als de melding Boost gestart aanstaat. Tablets worden hoe dan ook gewekt.", + "panel.boost_preview_now": "{what} leveren ×{multiplier} op voor {who}, vanaf nu, {minutes} minuten lang (tot {until}).", + "panel.boost_preview_later": "{what} leveren ×{multiplier} op voor {who}, vanaf {time}, {minutes} minuten lang.", + "panel.boost_preview_rule": "Elke {days}, {start}–{end}: {what} leveren ×{multiplier} op voor {who}.", + "panel.boost_later_invalid": "Kies een tijd later vandaag.", + "panel.boost_started": "Boost gestart", + "panel.boost_scheduled": "Boost ingepland", + "panel.boost_ended": "Boost beëindigd", + "panel.boost_settings_title": "Boostvensters", + "panel.boost_settings_hint": "Vermenigvuldigers voor gekozen taken, voor een beperkte tijd. Start er een vanuit Vandaag, stel hier terugkerende in, of gebruik de dienst taskmate.start_boost in een automatisering.", + "panel.boost_stacking": "In het weekend of op een verjaardag", + "panel.boost_stacking_hint": "Die dagen leveren al een vermenigvuldiger op. Kies hoe een boost daarmee samengaat.", + "panel.boost_stacking_highest": "Hoogste telt", + "panel.boost_stacking_highest_hint": "Een boost van ×2 op een zaterdag met ×2 levert ×2 op. De grootste geldt.", + "panel.boost_stacking_stack": "Opstapelen", + "panel.boost_stacking_stack_hint": "Een boost van ×2 op een zaterdag met ×2 levert ×4 op.", + "panel.boost_wake_screens": "Deze tablets wekken als een boost begint", + "panel.boost_wake_screens_hint": "Fully Kiosk Browser: scherm aan, schermbeveiliging uit, browser naar voren.", + "panel.boost_wake_screens_none": "Geen Fully Kiosk Browser-tablets gevonden. Voeg de integratie Fully Kiosk Browser toe aan Home Assistant om er een te wekken.", + "panel.boost_wake_devices": "Deze telefoons en tablets wekken", + "panel.boost_wake_devices_hint": "Home Assistant Companion-app op Android: stuurt command_screen_on.", + "panel.boost_wake_devices_none": "Geen apparaten met de Companion-app gevonden.", + "panel.boost_companion_tag": "Companion-app", + "panel.boost_test_wake": "Nu testen", + "panel.boost_test_wake_hint": "Gebruikt de opgeslagen keuzes. Sla eerst op als je ze hebt gewijzigd.", + "panel.boost_test_wake_sent": "Wekken verstuurd naar {count} scherm(en)", + "panel.boost_rules": "Terugkerende boosts", + "panel.boost_rules_hint": "Herhalen vanzelf. Vandaag toont elke boost voordat hij begint.", + "panel.boost_rule_add": "Terugkerende boost toevoegen", + "panel.boost_rule_edit": "Terugkerende boost bewerken", + "panel.boost_rule_edit_btn": "Bewerken", + "panel.boost_rule_delete": "Verwijderen", + "panel.boost_rule_delete_confirm": "Deze terugkerende boost verwijderen?", + "panel.boost_rule_deleted": "Terugkerende boost verwijderd", + "panel.boost_rule_saved": "Terugkerende boost opgeslagen", + "panel.boost_rule_need_day": "Kies minstens één dag.", + "panel.boost_rule_bad_times": "De eindtijd moet na de begintijd liggen.", + "panel.boost_rule_on": "Aan", + "panel.boost_rule_unnamed": "Boost", + "panel.boost_days": "Dagen", + "panel.boost_from": "Van", + "panel.boost_to": "Tot", + "panel.boost_everyone_lc": "iedereen" } diff --git a/custom_components/taskmate/www/locales/nn.json b/custom_components/taskmate/www/locales/nn.json index c24a3958..318ec281 100644 --- a/custom_components/taskmate/www/locales/nn.json +++ b/custom_components/taskmate/www/locales/nn.json @@ -3480,5 +3480,94 @@ "bests.record_best_day_points": "Beste dag ({points_name})", "bests.record_best_day_chores": "Flest oppgåver på éin dag", "bests.record_best_week_points": "Beste veke ({points_name})", - "bests.record_best_single_award": "Største løning" + "bests.record_best_single_award": "Største løning", + "notify.boost_started": "⚡ Boost! {chores_text} gjev ×{multiplier} dei neste {minutes} minutta.", + "notify.boost_all_chores": "Alle oppgåver", + "notification.boost_started.name": "Boost starta", + "notification.boost_started.description": "Fortel borna eit boost gjeld for at det har byrja, kor stort det er og kor lenge det varer.", + "child.boost_title": "Boost ×{multiplier}", + "child.boost_title_named": "Boost ×{multiplier} – {name}", + "child.boost_left": "att", + "child.boost_next": "Neste boost: {time} · {what} ×{multiplier}", + "child.boost_all_chores": "Alle oppgåver", + "child.boost_some_chores": "{first} og {count} til", + "child.boost_takeover_title": "BOOST!", + "child.boost_takeover_all": "Alle oppgåver gjev ×{multiplier} dei neste", + "child.boost_takeover_some": "gjev ×{multiplier} dei neste", + "child.boost_takeover_go": "Køyr på! 🚀", + "child.editor.show_boost_alert": "Vis boost-varsel når eit boost startar", + "kiosk.boost_title": "BOOST-TID!", + "kiosk.boost_sub": "{what} gjev ×{multiplier} dei neste", + "kiosk.boost_go": "Trykk for å starte! 🚀", + "kiosk.boost_strip": "Boost ×{multiplier} · {what}", + "kiosk.editor.show_boost_alert": "Fyll skjermen når eit boost startar", + "panel.boost_start": "Start eit boost", + "panel.boost_card_title": "Boost", + "panel.boost_live": "{count} aktive", + "panel.boost_ends": "sluttar {time} ({minutes} min att)", + "panel.boost_starts": "{start}–{end}", + "panel.boost_recurring": "gjentek seg", + "panel.boost_end_now": "Avslutt no", + "panel.boost_skip": "Hopp over denne gongen", + "panel.boost_call_off": "Avlys", + "panel.boost_all_chores": "Alle oppgåver", + "panel.boost_n_chores": "{first} og {count} til", + "panel.boost_everyone": "Alle", + "panel.boost_dialog_title": "Start eit boost", + "panel.boost_when": "Når", + "panel.boost_now": "No", + "panel.boost_later": "Seinare i dag", + "panel.boost_pays": "Gjev", + "panel.boost_for": "Varigheit", + "panel.boost_minutes": "{count} min", + "panel.boost_hour": "1 time", + "panel.boost_hours": "{count} timar", + "panel.boost_which_chores": "Kva oppgåver", + "panel.boost_who": "Kven", + "panel.boost_name": "Namn (valfritt)", + "panel.boost_name_ph": "Blir vist på korta, t.d. Gjester kl. 18", + "panel.boost_notify": "Gje borna beskjed", + "panel.boost_notify_hint": "Varsel på telefonen dersom varselet Boost starta er på. Nettbrett blir vekte uansett.", + "panel.boost_preview_now": "{what} gjev ×{multiplier} for {who}, frå no i {minutes} minutt (til {until}).", + "panel.boost_preview_later": "{what} gjev ×{multiplier} for {who}, frå {time} i {minutes} minutt.", + "panel.boost_preview_rule": "Kvar {days}, {start}–{end}: {what} gjev ×{multiplier} for {who}.", + "panel.boost_later_invalid": "Vel eit seinare tidspunkt i dag.", + "panel.boost_started": "Boost starta", + "panel.boost_scheduled": "Boost planlagt", + "panel.boost_ended": "Boost avslutta", + "panel.boost_settings_title": "Boost-vindauge", + "panel.boost_settings_hint": "Tidsavgrensa multiplikatorar på valde oppgåver. Start eitt frå I dag, lag gjentekne her, eller bruk tenesta taskmate.start_boost i ein automasjon.", + "panel.boost_stacking": "I helga eller på bursdagar", + "panel.boost_stacking_hint": "Desse dagane gjev alt ein multiplikator. Vel korleis eit boost blir kombinert med han.", + "panel.boost_stacking_highest": "Den høgaste gjeld", + "panel.boost_stacking_highest_hint": "Eit ×2-boost på ein ×2-laurdag gjev ×2. Den største gjeld.", + "panel.boost_stacking_stack": "Legg dei saman", + "panel.boost_stacking_stack_hint": "Eit ×2-boost på ein ×2-laurdag gjev ×4.", + "panel.boost_wake_screens": "Vekk desse nettbretta når eit boost startar", + "panel.boost_wake_screens_hint": "Fully Kiosk Browser: skjerm på, skjermsparar av, nettlesar framme.", + "panel.boost_wake_screens_none": "Fann ingen Fully Kiosk-nettbrett. Legg til Fully Kiosk Browser-integrasjonen i Home Assistant for å vekkje eitt.", + "panel.boost_wake_devices": "Vekk desse telefonane og nettbretta", + "panel.boost_wake_devices_hint": "Home Assistant Companion-appen på Android: sender command_screen_on.", + "panel.boost_wake_devices_none": "Fann ingen einingar med Companion-appen.", + "panel.boost_companion_tag": "Companion-app", + "panel.boost_test_wake": "Test vekking no", + "panel.boost_test_wake_hint": "Brukar dei lagra vala. Lagre først etter endringar.", + "panel.boost_test_wake_sent": "Vekking sendt til {count} skjerm(ar)", + "panel.boost_rules": "Gjentekne boost", + "panel.boost_rules_hint": "Går av seg sjølv. I dag viser kvart av dei før det startar.", + "panel.boost_rule_add": "Legg til gjenteke boost", + "panel.boost_rule_edit": "Rediger gjenteke boost", + "panel.boost_rule_edit_btn": "Rediger", + "panel.boost_rule_delete": "Slett", + "panel.boost_rule_delete_confirm": "Slette dette gjentekne boostet?", + "panel.boost_rule_deleted": "Gjenteke boost sletta", + "panel.boost_rule_saved": "Gjenteke boost lagra", + "panel.boost_rule_need_day": "Vel minst éin dag.", + "panel.boost_rule_bad_times": "Sluttida må vere etter starttida.", + "panel.boost_rule_on": "På", + "panel.boost_rule_unnamed": "Boost", + "panel.boost_days": "Dagar", + "panel.boost_from": "Frå", + "panel.boost_to": "Til", + "panel.boost_everyone_lc": "alle" } diff --git a/custom_components/taskmate/www/locales/pl.json b/custom_components/taskmate/www/locales/pl.json index 6769ef48..c94580aa 100644 --- a/custom_components/taskmate/www/locales/pl.json +++ b/custom_components/taskmate/www/locales/pl.json @@ -3480,5 +3480,94 @@ "bests.record_best_day_points": "Najlepszy dzień ({points_name})", "bests.record_best_day_chores": "Najwięcej obowiązków w jeden dzień", "bests.record_best_week_points": "Najlepszy tydzień ({points_name})", - "bests.record_best_single_award": "Największa nagroda" + "bests.record_best_single_award": "Największa nagroda", + "notify.boost_started": "⚡ Boost! {chores_text} są warte ×{multiplier} przez następne {minutes} min.", + "notify.boost_all_chores": "Wszystkie obowiązki", + "notification.boost_started.name": "Boost rozpoczęty", + "notification.boost_started.description": "Informuje dzieci objęte boostem, że się zaczął, jak duży jest i ile trwa.", + "child.boost_title": "Boost ×{multiplier}", + "child.boost_title_named": "Boost ×{multiplier} — {name}", + "child.boost_left": "zostało", + "child.boost_next": "Następny boost: {time} · {what} ×{multiplier}", + "child.boost_all_chores": "Wszystkie obowiązki", + "child.boost_some_chores": "{first} i {count} więcej", + "child.boost_takeover_title": "BOOST!", + "child.boost_takeover_all": "Każdy obowiązek jest wart ×{multiplier} przez następne", + "child.boost_takeover_some": "są warte ×{multiplier} przez następne", + "child.boost_takeover_go": "Do dzieła! 🚀", + "child.editor.show_boost_alert": "Pokaż alert, gdy zaczyna się boost", + "kiosk.boost_title": "CZAS NA BOOST!", + "kiosk.boost_sub": "{what} są warte ×{multiplier} przez następne", + "kiosk.boost_go": "Dotknij, aby zacząć! 🚀", + "kiosk.boost_strip": "Boost ×{multiplier} · {what}", + "kiosk.editor.show_boost_alert": "Wypełnij ekran, gdy zaczyna się boost", + "panel.boost_start": "Rozpocznij boost", + "panel.boost_card_title": "Boosty", + "panel.boost_live": "{count} aktywne", + "panel.boost_ends": "kończy się o {time} (zostało {minutes} min)", + "panel.boost_starts": "{start}–{end}", + "panel.boost_recurring": "cykliczny", + "panel.boost_end_now": "Zakończ teraz", + "panel.boost_skip": "Pomiń tym razem", + "panel.boost_call_off": "Odwołaj", + "panel.boost_all_chores": "Wszystkie obowiązki", + "panel.boost_n_chores": "{first} i {count} więcej", + "panel.boost_everyone": "Wszyscy", + "panel.boost_dialog_title": "Rozpocznij boost", + "panel.boost_when": "Kiedy", + "panel.boost_now": "Teraz", + "panel.boost_later": "Później dzisiaj", + "panel.boost_pays": "Mnożnik", + "panel.boost_for": "Czas trwania", + "panel.boost_minutes": "{count} min", + "panel.boost_hour": "1 godzina", + "panel.boost_hours": "{count} godz.", + "panel.boost_which_chores": "Które obowiązki", + "panel.boost_who": "Kto", + "panel.boost_name": "Nazwa (opcjonalnie)", + "panel.boost_name_ph": "Widoczna na kartach, np. Goście o 18", + "panel.boost_notify": "Powiadom dzieci", + "panel.boost_notify_hint": "Powiadomienie na telefon, jeśli „Boost rozpoczęty” jest włączony. Tablety budzą się w każdym przypadku.", + "panel.boost_preview_now": "{what} są warte ×{multiplier} dla: {who}, od teraz przez {minutes} min (do {until}).", + "panel.boost_preview_later": "{what} są warte ×{multiplier} dla: {who}, od {time} przez {minutes} min.", + "panel.boost_preview_rule": "Co {days}, {start}–{end}: {what} są warte ×{multiplier} dla: {who}.", + "panel.boost_later_invalid": "Wybierz późniejszą godzinę dzisiaj.", + "panel.boost_started": "Boost rozpoczęty", + "panel.boost_scheduled": "Boost zaplanowany", + "panel.boost_ended": "Boost zakończony", + "panel.boost_settings_title": "Okna boostów", + "panel.boost_settings_hint": "Ograniczone w czasie mnożniki dla wybranych obowiązków. Rozpocznij boost z ekranu Dziś, ustaw cykliczne tutaj albo użyj usługi taskmate.start_boost w automatyzacji.", + "panel.boost_stacking": "W weekend lub urodziny", + "panel.boost_stacking_hint": "Te dni mają już mnożnik. Wybierz, jak łączy się z nim boost.", + "panel.boost_stacking_highest": "Wygrywa większy", + "panel.boost_stacking_highest_hint": "Boost ×2 w sobotę ×2 daje ×2. Obowiązuje większy.", + "panel.boost_stacking_stack": "Łącz je", + "panel.boost_stacking_stack_hint": "Boost ×2 w sobotę ×2 daje ×4.", + "panel.boost_wake_screens": "Budź te tablety, gdy zaczyna się boost", + "panel.boost_wake_screens_hint": "Fully Kiosk Browser: ekran włączony, wygaszacz wyłączony, przeglądarka na wierzchu.", + "panel.boost_wake_screens_none": "Nie znaleziono tabletów Fully Kiosk. Dodaj integrację Fully Kiosk Browser do Home Assistant, aby je budzić.", + "panel.boost_wake_devices": "Budź te telefony i tablety", + "panel.boost_wake_devices_hint": "Aplikacja Home Assistant Companion na Androidzie: wysyła command_screen_on.", + "panel.boost_wake_devices_none": "Nie znaleziono urządzeń z aplikacją Companion.", + "panel.boost_companion_tag": "Aplikacja Companion", + "panel.boost_test_wake": "Przetestuj budzenie", + "panel.boost_test_wake_hint": "Używa zapisanych wyborów. Po zmianach najpierw zapisz.", + "panel.boost_test_wake_sent": "Wysłano budzenie do {count} ekranów", + "panel.boost_rules": "Boosty cykliczne", + "panel.boost_rules_hint": "Uruchamiają się same. Ekran Dziś pokazuje każdy przed startem.", + "panel.boost_rule_add": "Dodaj boost cykliczny", + "panel.boost_rule_edit": "Edytuj boost cykliczny", + "panel.boost_rule_edit_btn": "Edytuj", + "panel.boost_rule_delete": "Usuń", + "panel.boost_rule_delete_confirm": "Usunąć ten boost cykliczny?", + "panel.boost_rule_deleted": "Boost cykliczny usunięty", + "panel.boost_rule_saved": "Boost cykliczny zapisany", + "panel.boost_rule_need_day": "Wybierz co najmniej jeden dzień.", + "panel.boost_rule_bad_times": "Godzina końca musi być po godzinie początku.", + "panel.boost_rule_on": "Włączony", + "panel.boost_rule_unnamed": "Boost", + "panel.boost_days": "Dni", + "panel.boost_from": "Od", + "panel.boost_to": "Do", + "panel.boost_everyone_lc": "wszystkich" } diff --git a/custom_components/taskmate/www/locales/pt-BR.json b/custom_components/taskmate/www/locales/pt-BR.json index 075a31fd..7d08156a 100644 --- a/custom_components/taskmate/www/locales/pt-BR.json +++ b/custom_components/taskmate/www/locales/pt-BR.json @@ -3480,5 +3480,94 @@ "bests.record_best_day_points": "Melhor dia ({points_name})", "bests.record_best_day_chores": "Mais tarefas em um dia", "bests.record_best_week_points": "Melhor semana ({points_name})", - "bests.record_best_single_award": "Maior prêmio" + "bests.record_best_single_award": "Maior prêmio", + "notify.boost_started": "⚡ Boost! {chores_text} valem ×{multiplier} pelos próximos {minutes} minutos.", + "notify.boost_all_chores": "Todas as tarefas", + "notification.boost_started.name": "Boost iniciado", + "notification.boost_started.description": "Avisa as crianças incluídas que um boost começou, o tamanho e a duração.", + "child.boost_title": "Boost ×{multiplier}", + "child.boost_title_named": "Boost ×{multiplier} — {name}", + "child.boost_left": "restantes", + "child.boost_next": "Próximo boost: {time} · {what} ×{multiplier}", + "child.boost_all_chores": "Todas as tarefas", + "child.boost_some_chores": "{first} e mais {count}", + "child.boost_takeover_title": "BOOST!", + "child.boost_takeover_all": "Todas as tarefas valem ×{multiplier} pelos próximos", + "child.boost_takeover_some": "valem ×{multiplier} pelos próximos", + "child.boost_takeover_go": "Vamos lá! 🚀", + "child.editor.show_boost_alert": "Mostrar o aviso quando um boost começar", + "kiosk.boost_title": "HORA DO BOOST!", + "kiosk.boost_sub": "{what} valem ×{multiplier} pelos próximos", + "kiosk.boost_go": "Toque para começar! 🚀", + "kiosk.boost_strip": "Boost ×{multiplier} · {what}", + "kiosk.editor.show_boost_alert": "Preencher a tela quando um boost começar", + "panel.boost_start": "Iniciar um boost", + "panel.boost_card_title": "Boosts", + "panel.boost_live": "{count} ativos", + "panel.boost_ends": "termina às {time} (faltam {minutes} min)", + "panel.boost_starts": "{start}–{end}", + "panel.boost_recurring": "recorrente", + "panel.boost_end_now": "Encerrar agora", + "panel.boost_skip": "Pular desta vez", + "panel.boost_call_off": "Cancelar", + "panel.boost_all_chores": "Todas as tarefas", + "panel.boost_n_chores": "{first} e mais {count}", + "panel.boost_everyone": "Todos", + "panel.boost_dialog_title": "Iniciar um boost", + "panel.boost_when": "Quando", + "panel.boost_now": "Agora", + "panel.boost_later": "Mais tarde hoje", + "panel.boost_pays": "Vale", + "panel.boost_for": "Duração", + "panel.boost_minutes": "{count} min", + "panel.boost_hour": "1 hora", + "panel.boost_hours": "{count} horas", + "panel.boost_which_chores": "Que tarefas", + "panel.boost_who": "Quem", + "panel.boost_name": "Nome (opcional)", + "panel.boost_name_ph": "Aparece nos cards, ex. Visitas às seis", + "panel.boost_notify": "Avisar as crianças", + "panel.boost_notify_hint": "Notificação no celular se \"Boost iniciado\" estiver ligada. Os tablets acordam de qualquer jeito.", + "panel.boost_preview_now": "{what} valem ×{multiplier} para {who}, a partir de agora, por {minutes} minutos (até {until}).", + "panel.boost_preview_later": "{what} valem ×{multiplier} para {who}, a partir das {time} por {minutes} minutos.", + "panel.boost_preview_rule": "Todas as {days}, {start}–{end}: {what} valem ×{multiplier} para {who}.", + "panel.boost_later_invalid": "Escolha um horário mais tarde hoje.", + "panel.boost_started": "Boost iniciado", + "panel.boost_scheduled": "Boost agendado", + "panel.boost_ended": "Boost encerrado", + "panel.boost_settings_title": "Janelas de boost", + "panel.boost_settings_hint": "Multiplicadores com hora marcada em tarefas escolhidas. Inicie um a partir de Hoje, crie recorrentes aqui ou use o serviço taskmate.start_boost em uma automação.", + "panel.boost_stacking": "Ao fim de semana ou num aniversário", + "panel.boost_stacking_hint": "Esses dias já têm um multiplicador. Escolha como um boost se combina com ele.", + "panel.boost_stacking_highest": "O maior ganha", + "panel.boost_stacking_highest_hint": "Um boost ×2 num sábado ×2 vale ×2. Aplica-se o maior.", + "panel.boost_stacking_stack": "Somar os dois", + "panel.boost_stacking_stack_hint": "Um boost ×2 num sábado ×2 vale ×4.", + "panel.boost_wake_screens": "Acordar estes tablets quando um boost começar", + "panel.boost_wake_screens_hint": "Fully Kiosk Browser: tela ligada, protetor de tela desligado, navegador na frente.", + "panel.boost_wake_screens_none": "Nenhum tablet Fully Kiosk encontrado. Adicione a integração Fully Kiosk Browser ao Home Assistant para acordar um.", + "panel.boost_wake_devices": "Acordar estes celulares e tablets", + "panel.boost_wake_devices_hint": "App Companion do Home Assistant no Android: envia command_screen_on.", + "panel.boost_wake_devices_none": "Nenhum dispositivo com a app Companion encontrado.", + "panel.boost_companion_tag": "App Companion", + "panel.boost_test_wake": "Testar acordar agora", + "panel.boost_test_wake_hint": "Usa as escolhas salvas. Salve primeiro depois de mudar.", + "panel.boost_test_wake_sent": "Enviado para {count} tela(s)", + "panel.boost_rules": "Boosts recorrentes", + "panel.boost_rules_hint": "Repetem sozinhos. Hoje mostra cada um antes de começar.", + "panel.boost_rule_add": "Adicionar boost recorrente", + "panel.boost_rule_edit": "Editar boost recorrente", + "panel.boost_rule_edit_btn": "Editar", + "panel.boost_rule_delete": "Excluir", + "panel.boost_rule_delete_confirm": "Excluir este boost recorrente?", + "panel.boost_rule_deleted": "Boost recorrente excluído", + "panel.boost_rule_saved": "Boost recorrente salvo", + "panel.boost_rule_need_day": "Escolha pelo menos um dia.", + "panel.boost_rule_bad_times": "O horário de fim precisa ser depois do início.", + "panel.boost_rule_on": "Ligado", + "panel.boost_rule_unnamed": "Boost", + "panel.boost_days": "Dias", + "panel.boost_from": "Das", + "panel.boost_to": "Às", + "panel.boost_everyone_lc": "todos" } diff --git a/custom_components/taskmate/www/locales/pt.json b/custom_components/taskmate/www/locales/pt.json index cb648ed6..3c890085 100644 --- a/custom_components/taskmate/www/locales/pt.json +++ b/custom_components/taskmate/www/locales/pt.json @@ -3480,5 +3480,94 @@ "bests.record_best_day_points": "Melhor dia ({points_name})", "bests.record_best_day_chores": "Mais tarefas num dia", "bests.record_best_week_points": "Melhor semana ({points_name})", - "bests.record_best_single_award": "Maior prémio" + "bests.record_best_single_award": "Maior prémio", + "notify.boost_started": "⚡ Boost! {chores_text} valem ×{multiplier} durante os próximos {minutes} minutos.", + "notify.boost_all_chores": "Todas as tarefas", + "notification.boost_started.name": "Boost iniciado", + "notification.boost_started.description": "Avisa as crianças abrangidas que um boost começou, o tamanho e a duração.", + "child.boost_title": "Boost ×{multiplier}", + "child.boost_title_named": "Boost ×{multiplier} — {name}", + "child.boost_left": "restantes", + "child.boost_next": "Próximo boost: {time} · {what} ×{multiplier}", + "child.boost_all_chores": "Todas as tarefas", + "child.boost_some_chores": "{first} e mais {count}", + "child.boost_takeover_title": "BOOST!", + "child.boost_takeover_all": "Todas as tarefas valem ×{multiplier} durante os próximos", + "child.boost_takeover_some": "valem ×{multiplier} durante os próximos", + "child.boost_takeover_go": "Vamos lá! 🚀", + "child.editor.show_boost_alert": "Mostrar o aviso quando começa um boost", + "kiosk.boost_title": "HORA DO BOOST!", + "kiosk.boost_sub": "{what} valem ×{multiplier} durante os próximos", + "kiosk.boost_go": "Toca para começar! 🚀", + "kiosk.boost_strip": "Boost ×{multiplier} · {what}", + "kiosk.editor.show_boost_alert": "Encher o ecrã quando começa um boost", + "panel.boost_start": "Iniciar um boost", + "panel.boost_card_title": "Boosts", + "panel.boost_live": "{count} ativos", + "panel.boost_ends": "termina às {time} (faltam {minutes} min)", + "panel.boost_starts": "{start}–{end}", + "panel.boost_recurring": "recorrente", + "panel.boost_end_now": "Terminar já", + "panel.boost_skip": "Saltar desta vez", + "panel.boost_call_off": "Cancelar", + "panel.boost_all_chores": "Todas as tarefas", + "panel.boost_n_chores": "{first} e mais {count}", + "panel.boost_everyone": "Todos", + "panel.boost_dialog_title": "Iniciar um boost", + "panel.boost_when": "Quando", + "panel.boost_now": "Agora", + "panel.boost_later": "Mais tarde hoje", + "panel.boost_pays": "Vale", + "panel.boost_for": "Duração", + "panel.boost_minutes": "{count} min", + "panel.boost_hour": "1 hora", + "panel.boost_hours": "{count} horas", + "panel.boost_which_chores": "Que tarefas", + "panel.boost_who": "Quem", + "panel.boost_name": "Nome (opcional)", + "panel.boost_name_ph": "Aparece nos cartões, p. ex. Visitas às seis", + "panel.boost_notify": "Avisar as crianças", + "panel.boost_notify_hint": "Notificação no telemóvel se \"Boost iniciado\" estiver ligada. Os tablets acordam de qualquer forma.", + "panel.boost_preview_now": "{what} valem ×{multiplier} para {who}, a partir de agora, durante {minutes} minutos (até às {until}).", + "panel.boost_preview_later": "{what} valem ×{multiplier} para {who}, a partir das {time} durante {minutes} minutos.", + "panel.boost_preview_rule": "Todas as {days}, {start}–{end}: {what} valem ×{multiplier} para {who}.", + "panel.boost_later_invalid": "Escolhe uma hora mais tarde hoje.", + "panel.boost_started": "Boost iniciado", + "panel.boost_scheduled": "Boost agendado", + "panel.boost_ended": "Boost terminado", + "panel.boost_settings_title": "Janelas de boost", + "panel.boost_settings_hint": "Multiplicadores com hora marcada em tarefas escolhidas. Inicia um a partir de Hoje, cria recorrentes aqui ou usa o serviço taskmate.start_boost numa automação.", + "panel.boost_stacking": "Ao fim de semana ou num aniversário", + "panel.boost_stacking_hint": "Esses dias já têm um multiplicador. Escolhe como um boost se junta a ele.", + "panel.boost_stacking_highest": "O maior ganha", + "panel.boost_stacking_highest_hint": "Um boost ×2 num sábado ×2 vale ×2. Aplica-se o maior.", + "panel.boost_stacking_stack": "Somar os dois", + "panel.boost_stacking_stack_hint": "Um boost ×2 num sábado ×2 vale ×4.", + "panel.boost_wake_screens": "Acordar estes tablets quando começa um boost", + "panel.boost_wake_screens_hint": "Fully Kiosk Browser: ecrã ligado, proteção de ecrã desligada, navegador à frente.", + "panel.boost_wake_screens_none": "Nenhum tablet Fully Kiosk encontrado. Adiciona a integração Fully Kiosk Browser ao Home Assistant para acordar um.", + "panel.boost_wake_devices": "Acordar estes telemóveis e tablets", + "panel.boost_wake_devices_hint": "App Companion do Home Assistant em Android: envia command_screen_on.", + "panel.boost_wake_devices_none": "Nenhum dispositivo com a app Companion encontrado.", + "panel.boost_companion_tag": "App Companion", + "panel.boost_test_wake": "Testar acordar agora", + "panel.boost_test_wake_hint": "Usa as escolhas guardadas. Guarda primeiro depois de mudar.", + "panel.boost_test_wake_sent": "Enviado para {count} ecrã(s)", + "panel.boost_rules": "Boosts recorrentes", + "panel.boost_rules_hint": "Repetem-se sozinhos. Hoje mostra cada um antes de começar.", + "panel.boost_rule_add": "Adicionar boost recorrente", + "panel.boost_rule_edit": "Editar boost recorrente", + "panel.boost_rule_edit_btn": "Editar", + "panel.boost_rule_delete": "Eliminar", + "panel.boost_rule_delete_confirm": "Eliminar este boost recorrente?", + "panel.boost_rule_deleted": "Boost recorrente eliminado", + "panel.boost_rule_saved": "Boost recorrente guardado", + "panel.boost_rule_need_day": "Escolhe pelo menos um dia.", + "panel.boost_rule_bad_times": "A hora de fim tem de ser depois da hora de início.", + "panel.boost_rule_on": "Ligado", + "panel.boost_rule_unnamed": "Boost", + "panel.boost_days": "Dias", + "panel.boost_from": "Das", + "panel.boost_to": "Às", + "panel.boost_everyone_lc": "todos" } diff --git a/custom_components/taskmate/www/taskmate-child-card.js b/custom_components/taskmate/www/taskmate-child-card.js index 308ecf74..a9a4039d 100644 --- a/custom_components/taskmate/www/taskmate-child-card.js +++ b/custom_components/taskmate/www/taskmate-child-card.js @@ -104,6 +104,7 @@ class TaskMateChildCard extends LitElement { this._maybeBirthdayConfetti(attrs); this._maybeInspectionCelebration(attrs); this._maybeRecordConfetti(attrs); + this._maybeBoostTakeover(attrs); this._scheduleUndoExpiry(attrs); const sessions = attrs.active_timed_sessions || []; const hasRunning = sessions.some(s => s.state === 'running' && s.child_id === this.config?.child_id); @@ -115,7 +116,9 @@ class TaskMateChildCard extends LitElement { const at = new Date(c.deadline_at).getTime(); return !Number.isNaN(at) && at > now; }) || this._inspectionsOf((attrs.children || []).find(c => c.id === this.config?.child_id)) - .some(i => i.status === "open"); + .some(i => i.status === "open") + // Boost windows: the countdown and the moment a scheduled one begins. + || (window.__taskmate_boosts ? window.__taskmate_boosts(attrs, this.config?.child_id).length > 0 : false); if ((hasRunning || hasDeadline) && !this._timerInterval) { this._timerInterval = setInterval(() => { this._timerTick++; this.requestUpdate(); }, 1000); } else if (!hasRunning && !hasDeadline && this._timerInterval) { @@ -1439,6 +1442,34 @@ class TaskMateChildCard extends LitElement { .tm-care-owed .ic ha-icon { --mdc-icon-size: 26px; color: #8e44ad; } .tm-care-owed .tm-owed-body { flex: 1; min-width: 0; } .tm-care-record { background: #fff6d6; color: #6b4e00; } + /* Boost windows */ + ha-card { position: relative; } + ha-card:has(.tm-boost-take) { min-height: 460px; } + .tm-care-boost { position: relative; overflow: hidden; background: linear-gradient(120deg, #ffe2bf, #fff1c2); color: #4a2600; border: 1px solid #ffc778; } + .tm-care-boost .tm-boost-body { flex: 1; min-width: 0; } + .tm-boost-bolt { animation: tm-boost-pulse 1.6s ease-in-out infinite; } + .tm-boost-clock { font: 700 1.2rem/1 ui-monospace, Menlo, monospace; color: #b34f00; text-align: end; flex: none; } + .tm-boost-clock small { display: block; font: 600 .62rem sans-serif; color: #8a5a2a; text-transform: uppercase; letter-spacing: .06em; margin-top: 3px; } + .tm-boost-bar { position: absolute; inset-inline-start: 0; bottom: 0; height: 4px; background: #ff7a00; transition: width 1s linear; } + .tm-care-boost-next { background: #f4f6fa; color: #4b5468; } + .tm-boost-old { text-decoration: line-through; opacity: .6; } + .tm-boost-new { color: #b34f00; } + .tm-boost-x, .tm-boost-tag { background: #ff7a00 !important; color: #fff !important; border-radius: 999px; padding: 1px 7px; font-weight: 800; font-size: .75em; } + @keyframes tm-boost-pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.15); } } + .tm-boost-take { position: absolute; inset: 0; z-index: 30; display: flex; align-items: center; justify-content: center; padding: 20px; cursor: pointer; + background: radial-gradient(circle at 50% 35%, #ffb300 0%, #ff7a00 55%, #d84b00 100%); color: #fff; text-align: center; border-radius: inherit; animation: tm-boost-in .4s ease-out; } + .tm-boost-take-in { cursor: default; display: flex; flex-direction: column; align-items: center; gap: 4px; max-width: 360px; } + .tm-boost-take-bolt { font-size: 4rem; line-height: 1; animation: tm-boost-pulse 1.2s ease-in-out infinite; filter: drop-shadow(0 6px 12px rgba(0,0,0,.25)); } + .tm-boost-take-title { font-size: 2rem; font-weight: 800; letter-spacing: .02em; } + .tm-boost-take-mult { font: 900 3.6rem/1 sans-serif; text-shadow: 0 4px 0 rgba(0,0,0,.15); } + .tm-boost-take-chips { display: flex; flex-wrap: wrap; gap: 6px; justify-content: center; margin-top: 4px; } + .tm-boost-take-chips span { background: rgba(255,255,255,.22); border-radius: 999px; padding: 4px 11px; font-weight: 700; font-size: .9rem; } + .tm-boost-take-sub { font-size: 1.05rem; } + .tm-boost-take-clock { font: 800 2rem/1 ui-monospace, Menlo, monospace; background: rgba(0,0,0,.18); padding: 8px 16px; border-radius: 14px; margin: 8px 0 2px; } + .tm-boost-take-name { opacity: .85; font-size: .9rem; } + .tm-boost-take-go { margin-top: 12px; background: #fff; color: #c24a00; border: 0; border-radius: 999px; padding: 12px 28px; font: 800 1.05rem sans-serif; cursor: pointer; box-shadow: 0 6px 16px rgba(0,0,0,.2); } + @keyframes tm-boost-in { from { opacity: 0; transform: scale(.96); } to { opacity: 1; transform: none; } } + @media (prefers-reduced-motion: reduce) { .tm-boost-bolt, .tm-boost-take-bolt, .tm-boost-take { animation: none; } } .tm-care-goal.reached { background: #d9f5df; } .tm-goal-set { cursor: pointer; width: 100%; } .tm-goal-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 6px; } @@ -2472,7 +2503,7 @@ class TaskMateChildCard extends LitElement { ${this._renderSwappable(allChores, child, pointsIcon)} ${this._celebrating ? this._renderCelebration() : ""} - ${this._renderInspectionCelebration(pointsIcon)} + ${this._renderInspectionCelebration(pointsIcon)}${this._renderBoostTakeover()} ${this._confetti.length > 0 ? this._renderConfetti() : ""} ${this._renderPhotoCapture()} ${this._renderExtraCapture()} @@ -2822,7 +2853,8 @@ class TaskMateChildCard extends LitElement { chore, child, done, loading, onAct, index: i, dimmed, blocked, recLocked, firstComeLocked, weeklyDone, tone: this._designTone(i), glyph: this._choreGlyph(chore), - points: chore.effective_points ?? chore.points, + points: this._boostPoints(chore, child), + boost: this._boostMult(chore, child), timed: chore.task_type === "timed", mandatory: chore.mandatory === true, photo: chore.require_photo === true, @@ -2920,7 +2952,7 @@ class TaskMateChildCard extends LitElement { ${this._renderSwappable(allChores, child, pointsIcon)} ${this._celebrating ? this._renderCelebration() : ""} - ${this._renderInspectionCelebration(pointsIcon)} + ${this._renderInspectionCelebration(pointsIcon)}${this._renderBoostTakeover()} ${this._confetti.length > 0 ? this._renderConfetti() : ""} ${this._renderPhotoCapture()} ${this._renderExtraCapture()} @@ -2998,9 +3030,10 @@ class TaskMateChildCard extends LitElement { ? this._t("child.weekly_target_progress", { done: r.chore._weeklyProgress, target: r.chore._weeklyTarget }) : ""; return html` - ${r.mandatory || r.auction || r.photo || r.openEnded || depNames.length || recLabel || firstComeLabel || weeklyLabel || (r.team && !r.done) + ${(r.boost && !r.done) || r.mandatory || r.auction || r.photo || r.openEnded || depNames.length || recLabel || firstComeLabel || weeklyLabel || (r.team && !r.done) || (!r.done && (r.chore.estimated_minutes || r.chore.quantity_unit || this._helpEnabled())) ? html`
+ ${r.boost && !r.done ? html`⚡ ×${this._fmtMult(r.boost)}` : ""} ${this._choreExtraTags(r.chore, r.done, "tmd-tag")} ${r.done ? "" : this._renderHelp(r.chore, r.child, "tmd-tag")} ${r.mandatory ? html`⚠ ${this._t("child.mandatory")}` : ""} @@ -4172,7 +4205,7 @@ class TaskMateChildCard extends LitElement { ` : ''}
- +${chore.effective_points ?? chore.points} + ${isCompletedForToday ? html`+${chore.effective_points ?? chore.points}` : this._boostedPoints(chore, child)} ${dailyLimit > 1 ? html`(${completionsToday}/${dailyLimit})` : ''} ${chore._weeklyTarget > 0 ? html`${this._t('child.weekly_target_progress', { done: chore._weeklyProgress, target: chore._weeklyTarget })}` : ''}
@@ -5137,6 +5170,23 @@ class TaskMateChildCard extends LitElement { /** Sick-day banner, make-it-right offers and the weekly goal, above the chores. */ _renderCareBlocks(child, mode) { const parts = []; + // Boost windows: a live boost's countdown banner, else the next one coming. + const boosts = this._boosts(child); + const live = boosts.find(b => b.status === "active"); + if (live) { + const total = Math.max(1, live.endsMs - live.startsMs); + const left = Math.max(0, live.endsMs - Date.now()); + parts.push(html`
+ ⚡ + ${live.name ? this._t("child.boost_title_named", { multiplier: this._fmtMult(live.multiplier), name: live.name }) : this._t("child.boost_title", { multiplier: this._fmtMult(live.multiplier) })}
${this._boostWhat(live)}
+ ${this._clock(left)}${this._t("child.boost_left")} + +
`); + } else if (boosts.length) { + const next = boosts[0]; + parts.push(html`
+ 🕘${this._t("child.boost_next", { time: this._boostStart(next), multiplier: this._fmtMult(next.multiplier), what: this._boostWhat(next) })}
`); + } if (child.sick_today) { parts.push(html`
🤒${this._t("child.sick_title")}
${this._t("child.sick_body")}
`); @@ -5190,6 +5240,99 @@ class TaskMateChildCard extends LitElement { return html`
${parts}
${this._renderGoalSheet()}`; } + /* ── Boost windows ──────────────────────────────────────────────────── */ + + _attrsNow() { + return (window.__taskmate_attrs && window.__taskmate_attrs(this.hass, this.config?.entity)) + || this.hass?.states?.[this.config?.entity]?.attributes || {}; + } + + _boosts(child) { + return window.__taskmate_boosts && child ? window.__taskmate_boosts(this._attrsNow(), child.id) : []; + } + + _boostMult(chore, child) { + if (!chore || chore.task_type === "timed" || (chore.auction && chore.auction.child_id)) return 0; + // Nothing to multiply on an open-ended (0-point) chore. + if (!(Number(chore.effective_points ?? chore.points) > 0)) return 0; + const m = window.__taskmate_boost_for ? window.__taskmate_boost_for(this._boosts(child), chore.id) : 0; + return m > 1 ? m : 0; + } + + _boostPoints(chore, child) { + const base = chore.effective_points ?? chore.points; + const m = this._boostMult(chore, child); + return m && Number(base) > 0 ? Math.round(Number(base) * m) : base; + } + + /** Classic row: "+5" or, while boosted, "~~+5~~ +10 ×2". */ + _boostedPoints(chore, child) { + const base = chore.effective_points ?? chore.points; + const m = this._boostMult(chore, child); + if (!m || !(Number(base) > 0)) return html`+${base}`; + return html`+${base} +${Math.round(Number(base) * m)} ×${this._fmtMult(m)}`; + } + + _fmtMult(m) { + return String(Math.round(Number(m) * 10) / 10); + } + + _clock(ms) { + return window.__taskmate_clock ? window.__taskmate_clock(ms) : `${Math.ceil(ms / 60000)}m`; + } + + _boostWhat(boost) { + const names = boost.chore_names || []; + if (!names.length) return this._t("child.boost_all_chores"); + return names.length > 2 + ? this._t("child.boost_some_chores", { first: names.slice(0, 2).join(", "), count: names.length - 2 }) + : names.join(", "); + } + + _boostStart(boost) { + const d = new Date(boost.startsMs); + const time = d.toLocaleTimeString(this.hass?.locale?.language || undefined, { hour: "2-digit", minute: "2-digit" }); + if (d.toDateString() === new Date().toDateString()) return time; + return `${d.toLocaleDateString(this.hass?.locale?.language || undefined, { weekday: "long" })} ${time}`; + } + + /* The takeover plays once per device per boost, then the banner carries on. */ + _maybeBoostTakeover(attrs) { + if (this.config?.show_boost_alert === false || !window.__taskmate_boosts) return; + const child = (attrs.children || []).find(c => c.id === this.config?.child_id); + if (!child) return; + const live = window.__taskmate_boosts(attrs, child.id).find(b => b.status === "active"); + if (this._boostTake && (!live || live.id !== this._boostTake.id)) { this._boostTake = null; this.requestUpdate(); } + if (!live || this._boostTake || (window.__taskmate_boost_seen && window.__taskmate_boost_seen(live.id))) return; + this._boostTake = live; + this.requestUpdate(); + } + + _dismissBoostTakeover() { + if (this._boostTake && window.__taskmate_boost_mark) window.__taskmate_boost_mark(this._boostTake.id); + this._boostTake = null; + this.requestUpdate(); + } + + _renderBoostTakeover() { + const b = this._boostTake; + if (!b) return ""; + const names = b.chore_names || []; + return html` + `; + } + _pointsNameFor() { const attrs = (window.__taskmate_attrs && window.__taskmate_attrs(this.hass, this.config?.entity)) || this.hass?.states?.[this.config?.entity]?.attributes || {}; @@ -6003,6 +6146,7 @@ class TaskMateChildCardEditor extends LitElement { { name: 'show_mood', selector: { boolean: {} } }, { name: 'show_weekly_goal', selector: { boolean: {} } }, { name: 'show_personal_bests', selector: { boolean: {} } }, + { name: 'show_boost_alert', selector: { boolean: {} } }, { name: 'show_description', selector: { boolean: {} } }, { name: 'pre_reader', selector: { boolean: {} } }, { name: 'pre_reader_labels', selector: { boolean: {} } }, @@ -6030,6 +6174,7 @@ class TaskMateChildCardEditor extends LitElement { show_mood: this._t('child.editor.show_mood'), show_weekly_goal: this._t('child.editor.show_weekly_goal'), show_personal_bests: this._t('child.editor.show_personal_bests'), + show_boost_alert: this._t('child.editor.show_boost_alert'), show_description: this._t('child.editor.show_description'), pre_reader: this._t('child.editor.pre_reader'), pre_reader_labels: this._t('child.editor.pre_reader_labels'), @@ -6076,6 +6221,7 @@ class TaskMateChildCardEditor extends LitElement { show_mood: this.config.show_mood !== false, show_weekly_goal: this.config.show_weekly_goal !== false, show_personal_bests: this.config.show_personal_bests !== false, + show_boost_alert: this.config.show_boost_alert !== false, show_description: this.config.show_description === true, pre_reader: this.config.pre_reader === true, pre_reader_labels: this.config.pre_reader_labels === true, @@ -6118,7 +6264,7 @@ class TaskMateChildCardEditor extends LitElement { for (const [key, value] of Object.entries(newValues)) { const defaults = { show_countdown: true, show_minutes_left: true, show_help_button: true, show_mood: true, show_weekly_goal: true, - show_personal_bests: true, + show_personal_bests: true, show_boost_alert: true, show_description: false, debug: false, time_category: 'morning', due_days_mode: 'hide', recurrence_done_mode: 'dim', elapsed_time_mode: 'dim', diff --git a/custom_components/taskmate/www/taskmate-design.js b/custom_components/taskmate/www/taskmate-design.js index 8557490b..262d68e4 100644 --- a/custom_components/taskmate/www/taskmate-design.js +++ b/custom_components/taskmate/www/taskmate-design.js @@ -630,6 +630,62 @@ // hass update or page load. Shared by every card that celebrates, so a child // card and a points card on the same dashboard don't both go off. Keyed on // HA's time zone so the day rolls over with the backend, not the browser. + // ── Boost windows ───────────────────────────────────────────────────────── + // The overview sensor's `boosts` list holds live and upcoming boosts. The + // cards work out live/upcoming/over from the clock themselves, so a boost + // starts and ends on screen at the right second even between updates. + // __taskmate_boosts(attrs, childId?, nowMs?) -> boosts for that child + // (or all), each with status "active" | "upcoming", startsMs, endsMs. + // __taskmate_boost_for(boosts, choreId) -> the biggest live multiplier + // covering that chore, or 0. + // __taskmate_boost_seen(id) / __taskmate_boost_mark(id) -> the "show the + // takeover once per device per boost" gate, shared by every card. + window.__taskmate_boosts = window.__taskmate_boosts || function (attrs, childId, nowMs) { + const now = nowMs == null ? Date.now() : nowMs; + const list = (attrs && Array.isArray(attrs.boosts)) ? attrs.boosts : []; + const out = []; + for (const b of list) { + if (!b || !b.id) continue; + const startsMs = Date.parse(b.starts_at); + const endsMs = Date.parse(b.ends_at); + if (isNaN(startsMs) || isNaN(endsMs) || now >= endsMs) continue; + const kids = Array.isArray(b.child_ids) ? b.child_ids : []; + if (childId && kids.length && kids.indexOf(childId) === -1) continue; + out.push(Object.assign({}, b, { status: now < startsMs ? "upcoming" : "active", startsMs: startsMs, endsMs: endsMs })); + } + out.sort(function (a, b) { return (a.status === "active" ? 0 : 1) - (b.status === "active" ? 0 : 1) || a.startsMs - b.startsMs; }); + return out; + }; + window.__taskmate_boost_for = window.__taskmate_boost_for || function (boosts, choreId) { + let best = 0; + for (const b of boosts || []) { + if (b.status !== "active") continue; + const chores = Array.isArray(b.chore_ids) ? b.chore_ids : []; + if (chores.length && chores.indexOf(choreId) === -1) continue; + best = Math.max(best, Number(b.multiplier) || 0); + } + return best; + }; + (function () { + const KEY = "taskmate_boosts_seen"; + const read = function () { + try { const v = JSON.parse(window.localStorage.getItem(KEY) || "[]"); return Array.isArray(v) ? v : []; } catch (e) { return []; } + }; + window.__taskmate_boost_seen = window.__taskmate_boost_seen || function (id) { return read().indexOf(id) !== -1; }; + window.__taskmate_boost_mark = window.__taskmate_boost_mark || function (id) { + const seen = read(); + if (seen.indexOf(id) === -1) seen.push(id); + try { window.localStorage.setItem(KEY, JSON.stringify(seen.slice(-40))); } catch (e) { /* private mode: shows again next load */ } + }; + })(); + // "45:00" / "1:05:00" + window.__taskmate_clock = window.__taskmate_clock || function (ms) { + const s = Math.max(0, Math.ceil(ms / 1000)); + const h = Math.floor(s / 3600), m = Math.floor((s % 3600) / 60), sec = s % 60; + const pad = function (n) { return String(n).padStart(2, "0"); }; + return h ? h + ":" + pad(m) + ":" + pad(sec) : pad(m) + ":" + pad(sec); + }; + window.__taskmate_birthday_once = window.__taskmate_birthday_once || function (hass, childId) { if (!childId) return false; let day; diff --git a/custom_components/taskmate/www/taskmate-kiosk-card.js b/custom_components/taskmate/www/taskmate-kiosk-card.js index 41252c62..b9ac1ca8 100644 --- a/custom_components/taskmate/www/taskmate-kiosk-card.js +++ b/custom_components/taskmate/www/taskmate-kiosk-card.js @@ -479,7 +479,87 @@ class TaskMateKioskCard extends LitElement { return !(now >= start && now < Math.min(1440, end + allowance)); } - _pointsFor(chore) { return chore.effective_points ?? chore.points ?? 0; } + _pointsFor(chore, childId) { + const base = chore.effective_points ?? chore.points ?? 0; + const m = this._boostMult(chore, childId); + return m && Number(base) > 0 ? Math.round(Number(base) * m) : base; + } + + // ── Boost windows ──────────────────────────────────────────────────────── + // A live boost wakes the tablet out of ambient mode and fills the screen + // until someone taps; after that a countdown strip sits under the top bar. + + _boosts(childId) { + return window.__taskmate_boosts ? window.__taskmate_boosts(this._attrs(), childId) : []; + } + + _boostMult(chore, childId) { + if (!chore || !childId || chore.task_type === "timed" || (chore.auction && chore.auction.child_id)) return 0; + const m = window.__taskmate_boost_for ? window.__taskmate_boost_for(this._boosts(childId), chore.id) : 0; + return m > 1 ? m : 0; + } + + _fmtMult(m) { return String(Math.round(Number(m) * 10) / 10); } + + _boostWhat(b) { + const names = b.chore_names || []; + if (!names.length) return this._t("child.boost_all_chores"); + return names.length > 2 + ? this._t("child.boost_some_chores", { first: names.slice(0, 2).join(", "), count: names.length - 2 }) + : names.join(", "); + } + + /** Called every second from the tick: is there a live boost this tablet hasn't announced? */ + _checkBoost() { + const live = this._boosts().find(b => b.status === "active"); + if (this._boostTake && (!live || live.id !== this._boostTake.id)) { this._boostTake = null; return true; } + if (!live || this._boostTake || this.config.show_boost_alert === false) return false; + const key = `kiosk:${live.id}`; + if (window.__taskmate_boost_seen && window.__taskmate_boost_seen(key)) return false; + this._boostTake = live; + // Wake out of the ambient screen (and keep the idle timer from sending a + // child's screen back to the picker underneath). + this._ambient = false; + this._pickerIdle = 0; + this._idle = 0; + return true; + } + + _dismissBoost() { + if (this._boostTake && window.__taskmate_boost_mark) window.__taskmate_boost_mark(`kiosk:${this._boostTake.id}`); + this._boostTake = null; + this._pickerIdle = 0; + this.requestUpdate(); + } + + _renderBoostStrip() { + const live = this._boosts().find(b => b.status === "active"); + if (!live || this._boostTake) return ""; + const clock = window.__taskmate_clock ? window.__taskmate_clock(live.endsMs - Date.now()) : ""; + return html`
+ + ${this._t("kiosk.boost_strip", { multiplier: this._fmtMult(live.multiplier), what: this._boostWhat(live) })} + ${clock} +
`; + } + + _renderBoostTakeover(attrs) { + const b = this._boostTake; + if (!b) return ""; + const kids = (attrs.children || []).filter(c => !(b.child_ids || []).length || b.child_ids.includes(c.id)); + const clock = window.__taskmate_clock ? window.__taskmate_clock(b.endsMs - Date.now()) : ""; + return html` + `; + } /** The cheapest reward this child can't afford yet — what they're saving for. */ _nextReward(child) { @@ -1078,6 +1158,9 @@ class TaskMateKioskCard extends LitElement { const prevMinute = this._now.getMinutes(); this._now = new Date(); let dirty = this._now.getMinutes() !== prevMinute; + if (this._checkBoost()) dirty = true; + // A live boost's countdown ticks every second. + if (!dirty && this._boosts().some(b => b.status === "active")) dirty = true; if (this._screen === "pin" && this._lockedUntil) { if (this._lockSeconds() === 0) this._lockedUntil = 0; dirty = true; @@ -1164,8 +1247,10 @@ class TaskMateKioskCard extends LitElement { ` : ""}
+ ${this._renderBoostStrip()}
${body}
${this._renderRaffleReveal()} + ${this._renderBoostTakeover(attrs)} ${this._showBounties() ? html` this._bountyPhotoPicked(e)} @cancel=${() => this._photoCancelled()}>` : ""} @@ -1403,7 +1488,8 @@ class TaskMateKioskCard extends LitElement {
${chore.name}
- ${this._pointsFor(chore)} + ${this._pointsFor(chore, child.id)} + ${this._boostMult(chore, child.id) ? html`×${this._fmtMult(this._boostMult(chore, child.id))}` : ""} ${needsCheck ? html`${this._t("kiosk.needs_check")}` : ""} ${undoable ? html` +
@@ -5026,6 +5036,347 @@ class TaskMatePanel extends HTMLElement { `; } + // ── Boost windows ───────────────────────────────────────────────────── + // A boost is started, ended and skipped through the start_boost / + // end_boost services (the same door automations use); the recurring rules + // and the test wake are admin websocket commands. + + _boostList() { + const fn = window.__taskmate_boosts; + const list = this._state.boosts || []; + if (fn) return fn({ boosts: list }); + const now = Date.now(); + return list.map(b => ({ ...b, startsMs: Date.parse(b.starts_at), endsMs: Date.parse(b.ends_at) })) + .filter(b => b.endsMs > now).map(b => ({ ...b, status: b.startsMs > now ? "upcoming" : "active" })); + } + + _fmtMult(m) { return String(Math.round(Number(m) * 10) / 10); } + + _boostChoreText(choreIds) { + if (!choreIds || !choreIds.length) return this._t("panel.boost_all_chores"); + const names = Object.fromEntries((this._state.chores || []).map(c => [c.id, c.name])); + const list = choreIds.map(id => names[id]).filter(Boolean); + return list.length > 3 ? this._t("panel.boost_n_chores", { first: list.slice(0, 2).join(", "), count: list.length - 2 }) : list.join(", "); + } + + _boostKidText(childIds) { + if (!childIds || !childIds.length) return this._t("panel.boost_everyone"); + const names = Object.fromEntries((this._state.children || []).map(c => [c.id, c.name])); + return childIds.map(id => names[id]).filter(Boolean).join(", "); + } + + _hm(ms) { + return new Date(ms).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }); + } + + _renderBoostsCard() { + const boosts = this._boostList(); + if (!boosts.length) return ""; + const live = boosts.filter(b => b.status === "active").length; + return ` +
+

${this._t("panel.boost_card_title")} + ${live ? `${this._t("panel.boost_live", { count: live })}` : ""} + +

+
+ ${boosts.map(b => { + const active = b.status === "active"; + const when = active + ? this._t("panel.boost_ends", { time: this._hm(b.endsMs), minutes: Math.max(1, Math.ceil((b.endsMs - Date.now()) / 60000)) }) + : this._t("panel.boost_starts", { start: this._hm(b.startsMs), end: this._hm(b.endsMs) }); + const btn = active ? "panel.boost_end_now" : (b.rule_id ? "panel.boost_skip" : "panel.boost_call_off"); + return ` +
+ +
+ ×${this._esc(this._fmtMult(b.multiplier))}${b.name ? ` · ${this._esc(b.name)}` : ""} +
${this._esc(this._boostChoreText(b.chore_ids))} · ${this._esc(this._boostKidText(b.child_ids))} · ${this._esc(when)}${b.rule_id ? ` · ${this._t("panel.boost_recurring")}` : ""}
+
+ +
`; + }).join("")} +
+
`; + } + + _boostChips(d, kindAct) { + const chip = (act, id, on, label) => + ``; + const chores = (this._state.chores || []).filter(c => c.enabled !== false && c.task_type !== "timed"); + const kids = (this._state.children || []).filter(c => !c.is_adult); + return ` +
+ ${this._t("panel.boost_pays")} +
${[1.5, 2, 3].map(m => chip("boost-mult", m, Number(d.multiplier) === m, `×${m}`)).join("")}
+
+ ${kindAct === "boost" ? ` +
+ ${this._t("panel.boost_for")} +
${[15, 30, 45, 60, 120].map(n => chip("boost-len", n, Number(d.minutes) === n, + n < 60 ? this._t("panel.boost_minutes", { count: n }) : this._t(n === 60 ? "panel.boost_hour" : "panel.boost_hours", { count: n / 60 }))).join("")}
+
` : ""} +
+ ${this._t("panel.boost_which_chores")} +
+ ${chip("boost-chore", "__all__", !d.chore_ids.length, this._t("panel.boost_all_chores"))} + ${chores.map(c => chip("boost-chore", c.id, d.chore_ids.includes(c.id), this._esc(c.name))).join("")} +
+
+
+ ${this._t("panel.boost_who")} +
+ ${chip("boost-kid", "__all__", !d.child_ids.length, this._t("panel.boost_everyone"))} + ${kids.map(c => chip("boost-kid", c.id, d.child_ids.includes(c.id), this._esc(c.name))).join("")} +
+
+
+ ${this._t("panel.boost_name")} + +
+ ${this._switch(this._t("panel.boost_notify"), "notify", d.notify !== false, this._t("panel.boost_notify_hint"))}`; + } + + _renderBoostDialog() { + const d = this._dialog.data; + const body = ` +
+ ${this._t("panel.boost_when")} +
+ + + ${d.when === "later" ? `` : ""} +
+
+ ${this._boostChips(d, "boost")} +
⚡ ${this._esc(this._boostPreview(d))}
`; + return this._dialogShell(this._t("panel.boost_dialog_title"), body, + ` + `); + } + + _boostPreview(d) { + const what = this._boostChoreText(d.chore_ids); + // Mid-sentence, "everyone" stays lower case. + const who = d.child_ids && d.child_ids.length ? this._boostKidText(d.child_ids) : this._t("panel.boost_everyone_lc"); + const mult = this._fmtMult(d.multiplier); + if (this._dialog.kind === "boost-rule") { + const dayNames = (d.days || []).map(i => this._weekdayShort(i)).join(", ") || "—"; + return this._t("panel.boost_preview_rule", { what, who, multiplier: mult, days: dayNames, start: d.start || "", end: d.end || "" }); + } + const minutes = Number(d.minutes) || 0; + if (d.when === "later") return this._t("panel.boost_preview_later", { what, who, multiplier: mult, time: d.later || "", minutes }); + return this._t("panel.boost_preview_now", { what, who, multiplier: mult, minutes, until: this._hm(Date.now() + minutes * 60000) }); + } + + _weekdayShort(i) { + // 2024-01-01 was a Monday, so day i of that week is weekday i. + return new Date(2024, 0, 1 + Number(i)).toLocaleDateString([], { weekday: "short" }); + } + + _renderBoostRuleDialog() { + const d = this._dialog.data; + const dayChips = [0, 1, 2, 3, 4, 5, 6].map(i => + ``).join(""); + const body = ` +
+ ${this._t("panel.boost_days")} +
${dayChips}
+
+
+
${this._t("panel.boost_from")}
+
${this._t("panel.boost_to")}
+
+ ${this._boostChips(d, "boost-rule")} +
⚡ ${this._esc(this._boostPreview(d))}
`; + return this._dialogShell(this._t(d.rule_id ? "panel.boost_rule_edit" : "panel.boost_rule_add"), body, + `${d.rule_id ? `` : ""} + + `); + } + + _renderBoostSettings(s) { + const cand = this._state.boost_wake_candidates || { screens: [], devices: [] }; + const screens = s.boost_wake_screens || []; + const devices = s.boost_wake_devices || []; + const stacking = s.boost_stacking === "stack" ? "stack" : "highest"; + const rules = this._state.boost_rules || []; + const ck = (attr, id, label, tag, on) => ` + `; + // Picked before but gone from HA since: keep it visible so saving doesn't drop it silently. + const screenRows = [...cand.screens, ...screens.filter(id => !cand.screens.some(c => c.entity_id === id)).map(id => ({ entity_id: id, name: id }))]; + const deviceRows = [...cand.devices, ...devices.filter(id => !cand.devices.some(c => c.service === id)).map(id => ({ service: id, name: id }))]; + const radio = (value, title, hint) => ` + `; + return ` +
+

${this._t("panel.boost_settings_title")}

${this._t("panel.boost_settings_hint")}

+
+
+
${this._t("panel.boost_stacking")}${this._t("panel.boost_stacking_hint")}
+
+ ${radio("highest", this._t("panel.boost_stacking_highest"), this._t("panel.boost_stacking_highest_hint"))} + ${radio("stack", this._t("panel.boost_stacking_stack"), this._t("panel.boost_stacking_stack_hint"))} +
+
+
+
${this._t("panel.boost_wake_screens")}${this._t("panel.boost_wake_screens_hint")}
+
${screenRows.length + ? screenRows.map(c => ck("data-boost-screen", c.entity_id, c.name, "Fully Kiosk", screens.includes(c.entity_id))).join("") + : `${this._t("panel.boost_wake_screens_none")}`}
+
+
+
${this._t("panel.boost_wake_devices")}${this._t("panel.boost_wake_devices_hint")}
+
${deviceRows.length + ? deviceRows.map(c => ck("data-boost-device", c.service, c.name, this._t("panel.boost_companion_tag"), devices.includes(c.service))).join("") + : `${this._t("panel.boost_wake_devices_none")}`} + ${screens.length || devices.length ? `
+ ${this._t("panel.boost_test_wake_hint")}
` : ""} +
+
+
+
${this._t("panel.boost_rules")}${this._t("panel.boost_rules_hint")}
+
+ ${rules.map(r => ` +
+
${[0, 1, 2, 3, 4, 5, 6].map(i => `${this._esc(this._weekdayShort(i).slice(0, 2))}`).join("")}
+
${this._esc(r.name || this._t("panel.boost_rule_unnamed"))} · ×${this._esc(this._fmtMult(r.multiplier))} +
${this._esc(r.start)}–${this._esc(r.end)} · ${this._esc(this._boostChoreText(r.chore_ids))} · ${this._esc(this._boostKidText(r.child_ids))}
+ + +
`).join("")} + +
+
+
+
`; + } + + _boostClick(act, t) { + const d = this._dialog && (this._dialog.kind === "boost" || this._dialog.kind === "boost-rule") ? this._dialog.data : null; + const toggleList = (list, id) => { + if (id === "__all__") return []; + return list.includes(id) ? list.filter(x => x !== id) : [...list, id]; + }; + switch (act) { + case "boost-open": + this._openDialog({ kind: "boost", data: { when: "now", later: "", multiplier: 2, minutes: 45, chore_ids: [], child_ids: [], name: "", notify: true } }); + return true; + case "boost-rule-add": + this._openDialog({ kind: "boost-rule", data: { rule_id: "", days: [5], start: "09:00", end: "11:00", multiplier: 2, chore_ids: [], child_ids: [], name: "", notify: true, enabled: true } }); + return true; + case "boost-rule-edit": { + const r = (this._state.boost_rules || []).find(x => x.id === t.dataset.id); + if (!r) return true; + this._openDialog({ kind: "boost-rule", data: { rule_id: r.id, days: [...(r.days || [])], start: r.start, end: r.end, multiplier: r.multiplier, + chore_ids: [...(r.chore_ids || [])], child_ids: [...(r.child_ids || [])], name: r.name || "", notify: r.notify !== false, enabled: r.enabled !== false } }); + return true; + } + case "boost-rule-toggle": { + const r = (this._state.boost_rules || []).find(x => x.id === t.dataset.id); + if (r) this._saveBoostRule({ ...r, rule_id: r.id, enabled: !(r.enabled !== false) }, false); + return true; + } + case "boost-end": + this._endBoost(t.dataset.id); + return true; + case "boost-test-wake": + this._boostTestWake(); + return true; + case "boost-save": + this._startBoostFromDialog(); + return true; + case "boost-rule-save": + if (d) this._saveBoostRule(d, true); + return true; + case "boost-rule-delete": + if (d) this._deleteBoostRule(d.rule_id); + return true; + } + if (!d) return false; + switch (act) { + case "boost-when": d.when = t.dataset.id; break; + case "boost-mult": d.multiplier = Number(t.dataset.id); break; + case "boost-len": d.minutes = Number(t.dataset.id); break; + case "boost-chore": d.chore_ids = toggleList(d.chore_ids, t.dataset.id); break; + case "boost-kid": d.child_ids = toggleList(d.child_ids, t.dataset.id); break; + case "boost-day": { + const i = Number(t.dataset.id); + d.days = d.days.includes(i) ? d.days.filter(x => x !== i) : [...d.days, i].sort(); + break; + } + default: return false; + } + this._syncDialogInputs && this._syncDialogInputs(); + this._render(); + return true; + } + + async _startBoostFromDialog() { + const d = this._dialog.data; + const data = { multiplier: Number(d.multiplier), minutes: Number(d.minutes), chore_ids: d.chore_ids, child_ids: d.child_ids, + name: String(d.name || "").trim(), notify: d.notify !== false }; + if (d.when === "later") { + const m = /^(\d{2}):(\d{2})$/.exec(d.later || ""); + const at = m ? new Date() : null; + if (at) at.setHours(Number(m[1]), Number(m[2]), 0, 0); + if (!at || at.getTime() <= Date.now()) { this._showToast("err", this._t("panel.boost_later_invalid")); return; } + data.starts_at = at.toISOString(); + } + const { ok, err } = await this._callService("start_boost", data); + if (!ok) { this._showToast("err", err); return; } + this._closeDialog(true); + await this._fetchState(); + this._showToast("ok", this._t(d.when === "later" ? "panel.boost_scheduled" : "panel.boost_started")); + } + + async _endBoost(id) { + const { ok, err } = await this._callService("end_boost", { boost_id: id }); + if (!ok) { this._showToast("err", err); return; } + await this._fetchState(); + this._showToast("ok", this._t("panel.boost_ended")); + } + + async _saveBoostRule(d, fromDialog) { + if (!d.days || !d.days.length) { this._showToast("err", this._t("panel.boost_rule_need_day")); return; } + if (!(d.start < d.end)) { this._showToast("err", this._t("panel.boost_rule_bad_times")); return; } + const payload = { type: "taskmate/boosts/save_rule", days: d.days, start: d.start, end: d.end, multiplier: Number(d.multiplier), + chore_ids: d.chore_ids || [], child_ids: d.child_ids || [], name: String(d.name || "").trim(), notify: d.notify !== false, enabled: d.enabled !== false }; + if (d.rule_id) payload.rule_id = d.rule_id; + try { + await this._callWS(payload); + } catch (err) { + this._showToast("err", (err && err.message) || String(err)); + return; + } + if (fromDialog) this._closeDialog(true); + await this._fetchState(); + this._showToast("ok", this._t("panel.boost_rule_saved")); + } + + async _deleteBoostRule(id) { + if (!id || !confirm(this._t("panel.boost_rule_delete_confirm"))) return; + try { + await this._callWS({ type: "taskmate/boosts/delete_rule", rule_id: id }); + } catch (err) { + this._showToast("err", (err && err.message) || String(err)); + return; + } + this._closeDialog(true); + await this._fetchState(); + this._showToast("ok", this._t("panel.boost_rule_deleted")); + } + + async _boostTestWake() { + try { + const res = await this._callWS({ type: "taskmate/boosts/test_wake" }); + this._showToast("ok", this._t("panel.boost_test_wake_sent", { count: (res && res.sent) || 0 })); + } catch (err) { + this._showToast("err", (err && err.message) || String(err)); + } + } + /** "I'm stuck" requests still open, with an "On my way" button each. */ _renderHelpCard(kids) { const ids = new Set(kids.map(k => k.id)); @@ -9703,6 +10054,7 @@ class TaskMatePanel extends HTMLElement {
+ ${this._renderBoostSettings(s)}

${this._t("panel.allowance_title")}

${this._t("panel.allowance_hint")}

@@ -10397,6 +10749,8 @@ class TaskMatePanel extends HTMLElement { if (this._dialog.kind === "avatar-catalog") return this._renderAvatarCatalogDialog(); if (this._dialog.kind === "challenge") return this._renderChallengeDialog(); if (this._dialog.kind === "bounty") return this._renderBountyDialog(); + if (this._dialog.kind === "boost") return this._renderBoostDialog(); + if (this._dialog.kind === "boost-rule") return this._renderBoostRuleDialog(); if (this._dialog.kind === "auction") return this._renderAuctionDialog(); if (this._dialog.kind === "apply-penalty") return this._renderApplyDialog("penalty"); if (this._dialog.kind === "apply-bonus") return this._renderApplyDialog("bonus"); @@ -14111,6 +14465,29 @@ class TaskMatePanel extends HTMLElement { .tm-pill-info { background: color-mix(in srgb, var(--info-color, #039be5) 14%, transparent); color: var(--info-color, #039be5); } .tm-help-card { border-inline-start: 4px solid var(--warning-color, #ffa600); } .tm-owed-card { border-inline-start: 4px solid #8e44ad; } + /* Boost windows */ + .tm-boost-card { border-inline-start: 4px solid #ff7a00; } + .tm-boost-pill { background: #fff1e0; color: #b34f00; } + .tm-boost-btn { background: #ff7a00 !important; border-color: #ff7a00 !important; color: #fff !important; } + .tm-boost-row { justify-content: flex-start; } + .tm-boost-row .tm-help-text { flex: 1; } + .tm-boost-ic { width: 36px; height: 36px; border-radius: 10px; display: grid; place-items: center; font-size: 1.2rem; background: var(--secondary-background-color); flex: none; } + .tm-boost-live .tm-boost-ic { background: #fff1e0; } + .tm-boost-preview { background: #fff8ef; border: 1px dashed #ffc778; border-radius: 10px; padding: 10px 12px; color: #6b3a00; font-size: .92rem; } + .tm-setting-top { align-items: flex-start; } + .tm-boost-radios, .tm-boost-cks, .tm-boost-rules { display: flex; flex-direction: column; gap: 8px; flex: 1; min-width: 0; } + .tm-boost-radio { display: flex; gap: 10px; align-items: flex-start; border: 1px solid var(--divider-color); border-radius: 10px; padding: 10px 12px; cursor: pointer; } + .tm-boost-radio:has(input:checked) { border-color: var(--primary-color); background: color-mix(in srgb, var(--primary-color) 7%, transparent); } + .tm-boost-radio small { display: block; color: var(--secondary-text-color); } + .tm-boost-ck { display: flex; align-items: center; gap: 8px; } + .tm-boost-tag { font-size: .72rem; padding: 2px 7px; border-radius: 999px; background: var(--secondary-background-color); color: var(--secondary-text-color); } + .tm-boost-rule { display: flex; align-items: center; gap: 12px; border: 1px solid var(--divider-color); border-radius: 10px; padding: 10px 12px; } + .tm-boost-rule.off { opacity: .6; } + .tm-boost-rule .tm-help-text { flex: 1; min-width: 0; } + .tm-boost-days { display: flex; gap: 3px; flex: none; } + .tm-boost-days span { width: 24px; height: 24px; border-radius: 50%; display: grid; place-items: center; font-size: .66rem; font-weight: 700; + background: var(--secondary-background-color); color: var(--secondary-text-color); } + .tm-boost-days span.on { background: #ff7a00; color: #fff; } .tm-help-list { display: flex; flex-direction: column; gap: 8px; } .tm-help-row { display: flex; align-items: center; gap: 10px; justify-content: space-between; padding: 8px 0; border-top: 1px solid var(--divider-color); } .tm-help-row:first-child { border-top: 0; } diff --git a/mkdocs.yml b/mkdocs.yml index 5e36212d..71b744ac 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -110,6 +110,7 @@ nav: - "Wishlist": "Wishlist.md" - "Raffles": "Raffles.md" - "Reward Fulfilment": "Reward-Fulfilment.md" + - "Boost Windows": "Boost-Windows.md" - "Gamification": - "Levels & XP": "Levels-and-XP.md" - "Achievement Badges": "Achievement-Badges.md" diff --git a/tests/data/locale_english_baseline.json b/tests/data/locale_english_baseline.json index c0cef055..6a530453 100644 --- a/tests/data/locale_english_baseline.json +++ b/tests/data/locale_english_baseline.json @@ -8,6 +8,9 @@ "bounty.ok", "child.bonus_label", "child.bonus_tooltip", + "child.boost_takeover_title", + "child.boost_title", + "child.boost_title_named", "child.extra_submit", "child.level_label", "child.pause", @@ -16,6 +19,7 @@ "common.design.console", "common.design.playroom", "dashboard.tab_rotation", + "kiosk.boost_strip", "notify.celebration", "notify.month_year", "notify.period_range", @@ -24,6 +28,10 @@ "panel.badge_tab_title", "panel.badge_table_badge", "panel.badge_table_bonus", + "panel.boost_card_title", + "panel.boost_minutes", + "panel.boost_rule_unnamed", + "panel.boost_starts", "panel.bounty_col_status", "panel.bounty_completed_meta", "panel.child_avatar_label", @@ -67,11 +75,14 @@ "bounty.ok", "child.bonus_label", "child.bonus_tooltip", + "child.boost_takeover_title", + "child.boost_title", "child.pause", "common.design.cleanpro", "common.design.console", "common.design.playroom", "dashboard.tab_rotation", + "kiosk.boost_strip", "notify.celebration", "notify.month_11", "notify.month_4", @@ -91,6 +102,10 @@ "overview.default_title", "panel.badge_name_label", "panel.badge_table_bonus", + "panel.boost_card_title", + "panel.boost_name", + "panel.boost_rule_unnamed", + "panel.boost_starts", "panel.bounty_col_status", "panel.bounty_completed_meta", "panel.child_avatar_label", @@ -141,6 +156,8 @@ "bounty.ok", "bounty.photo_tag", "child.bonus_label", + "child.boost_title", + "child.boost_title_named", "child.parent", "child.pause", "child.pts_per_min", @@ -157,6 +174,7 @@ "dashboard.tab_rotation", "graph.total", "inspection.tag_open", + "kiosk.boost_strip", "notify.celebration", "notify.month_year", "notify.period_range", @@ -175,6 +193,10 @@ "panel.badge_table_badge", "panel.badge_table_bonus", "panel.badge_table_source", + "panel.boost_card_title", + "panel.boost_minutes", + "panel.boost_rule_unnamed", + "panel.boost_starts", "panel.bounty_col_points", "panel.bounty_completed_meta", "panel.bounty_points_label", @@ -232,6 +254,8 @@ "bounty.ok", "child.bonus_label", "child.bonus_tooltip", + "child.boost_takeover_title", + "child.boost_title", "child.error_title", "child.extra_submit", "child.pause", @@ -242,12 +266,16 @@ "common.design.cleanpro", "common.design.console", "common.design.playroom", + "kiosk.boost_strip", "notify.celebration", "notify.month_year", "notify.period_range", "notify.pet_evolved", "overview.default_title", "panel.badge_table_bonus", + "panel.boost_minutes", + "panel.boost_rule_unnamed", + "panel.boost_starts", "panel.bounty_col_status", "panel.bounty_completed_meta", "panel.child_avatar_label", @@ -287,11 +315,15 @@ "bounty.open_count", "child.bonus_label", "child.bonus_tooltip", + "child.boost_takeover_title", + "child.boost_title", + "child.boost_title_named", "child.pts_per_min", "child.pts_per_n_min", "child.start", "child.timed_cap_label", "common.design.console", + "kiosk.boost_strip", "kiosk.editor.show_confetti", "kiosk.raffle_winner", "notify.celebration", @@ -303,6 +335,10 @@ "panel.auction_col_max", "panel.auction_min_meta", "panel.badge_table_bonus", + "panel.boost_card_title", + "panel.boost_minutes", + "panel.boost_rule_unnamed", + "panel.boost_starts", "panel.bounty_col_status", "panel.bounty_completed_meta", "panel.bounty_status_open", @@ -353,6 +389,8 @@ "bounty.ok", "child.bonus_label", "child.bonus_tooltip", + "child.boost_takeover_title", + "child.boost_title", "child.error_title", "child.extra_submit", "child.pause", @@ -363,12 +401,16 @@ "common.design.cleanpro", "common.design.console", "common.design.playroom", + "kiosk.boost_strip", "notify.celebration", "notify.month_year", "notify.period_range", "notify.pet_evolved", "overview.default_title", "panel.badge_table_bonus", + "panel.boost_minutes", + "panel.boost_rule_unnamed", + "panel.boost_starts", "panel.bounty_col_status", "panel.bounty_completed_meta", "panel.child_avatar_label", @@ -404,17 +446,24 @@ "pl.json": [ "approvals.timed_duration", "badge.source_auto", + "child.boost_takeover_title", + "child.boost_title", + "child.boost_title_named", "child.pts_per_min", "child.pts_per_n_min", "child.start", "child.timed_cap_label", "common.design.cleanpro", + "kiosk.boost_strip", "notify.celebration", "notify.month_year", "notify.period_range", "notify.pet_evolved", "notify.short_date", "overview.default_title", + "panel.boost_minutes", + "panel.boost_rule_unnamed", + "panel.boost_starts", "panel.bounty_col_status", "panel.bounty_completed_meta", "panel.dash_card_kiosk", @@ -437,6 +486,9 @@ "badge.source_manual", "badge.tier_bronze", "bounty.ok", + "child.boost_takeover_title", + "child.boost_title", + "child.boost_title_named", "child.error_title", "child.pts_per_min", "child.pts_per_n_min", @@ -446,10 +498,15 @@ "common.design.playroom", "common.total", "graph.total", + "kiosk.boost_strip", "notify.celebration", "notify.period_range", "notify.pet_evolved", "overview.default_title", + "panel.boost_card_title", + "panel.boost_minutes", + "panel.boost_rule_unnamed", + "panel.boost_starts", "panel.bounty_col_status", "panel.bounty_completed_meta", "panel.child_avatar_label", @@ -476,6 +533,9 @@ "badge.source_manual", "badge.tier_bronze", "bounty.ok", + "child.boost_takeover_title", + "child.boost_title", + "child.boost_title_named", "child.error_title", "child.pts_per_min", "child.pts_per_n_min", @@ -485,10 +545,15 @@ "common.design.playroom", "common.total", "graph.total", + "kiosk.boost_strip", "notify.celebration", "notify.period_range", "notify.pet_evolved", "overview.default_title", + "panel.boost_card_title", + "panel.boost_minutes", + "panel.boost_rule_unnamed", + "panel.boost_starts", "panel.bounty_completed_meta", "panel.child_avatar_label", "panel.chore_subtask_points_placeholder", diff --git a/tests/frontend/taskmate-boosts.test.cjs b/tests/frontend/taskmate-boosts.test.cjs new file mode 100644 index 00000000..4114584c --- /dev/null +++ b/tests/frontend/taskmate-boosts.test.cjs @@ -0,0 +1,201 @@ +const assert = require("node:assert/strict"); +const { test } = require("node:test"); +const { readFileSync } = require("node:fs"); +const path = require("node:path"); +const vm = require("node:vm"); + +const { loadCard, render, localize, WWW } = require("./harness.cjs"); + +// Boost windows on the child card (every design), the kiosk card and the +// admin panel. The boost helpers come from the real taskmate-design.js. + +const DESIGNS = ["classic", "playroom", "console", "cleanpro", "accessible", "graphite"]; +const ENTITY = "sensor.taskmate_overview"; +const plain = (v) => JSON.parse(JSON.stringify(v)); + +function designHelpers() { + const store = {}; + const window = { matchMedia: () => ({ matches: false }), localStorage: { getItem: (k) => store[k] ?? null, setItem: (k, v) => { store[k] = v; } } }; + const el = () => ({ style: {}, setAttribute() {}, appendChild() {} }); + vm.runInNewContext(readFileSync(path.join(WWW, "taskmate-design.js"), "utf8"), { + window, + document: { documentElement: { getAttribute: () => "" }, getElementById: () => ({}), createElement: el, head: { appendChild() {} }, body: { appendChild() {} }, addEventListener() {} }, + customElements: { get: () => undefined }, + }); + const pick = {}; + for (const k of ["__taskmate_boosts", "__taskmate_boost_for", "__taskmate_boost_seen", "__taskmate_boost_mark", "__taskmate_clock"]) pick[k] = window[k]; + return pick; +} + +const minutes = (n) => new Date(Date.now() + n * 60000).toISOString(); +const liveBoost = (over = {}) => ({ id: "b1", name: "Guests at six", multiplier: 2, chore_ids: ["bins"], chore_names: ["Take the bins out"], + child_ids: [], starts_at: minutes(-5), ends_at: minutes(40), minutes: 45, ...over }); + +// ── child card ──────────────────────────────────────────────────────────── + +function childCard({ design = "classic", boosts = [liveBoost()], config = {} } = {}) { + const ChildCard = loadCard("taskmate-child-card.js", { window: designHelpers() }).get("taskmate-child-card"); + const card = new ChildCard(); + card.setConfig({ entity: ENTITY, child_id: "kid1", card_design: design, ...config }); + card.hass = { + states: { [ENTITY]: { state: "ok", attributes: { + children: [{ id: "kid1", name: "Mia", chore_order: [] }], + chores: [ + { id: "bins", name: "Take the bins out", points: 5, time_category: "anytime", assigned_to: [], due_days: [], schedule_mode: "specific_days", assignment_mode: "everyone" }, + { id: "bed", name: "Make bed", points: 2, time_category: "anytime", assigned_to: [], due_days: [], schedule_mode: "specific_days", assignment_mode: "everyone" }, + ], + todays_completions: [], chore_availability: {}, today_day_of_week: "wednesday", points_icon: "mdi:star", boosts, + } } }, + callService: async () => {}, + }; + card._loading = {}; + card._optimisticCompletions = {}; + card._playSound = () => {}; + card._spawnConfetti = () => {}; + return card; +} + +for (const design of DESIGNS) { + test(`child: ${design} shows the live boost banner and the boosted chore`, () => { + const { markup } = render(childCard({ design }).render()); + assert.ok(markup.includes(localize("child.boost_title_named", { multiplier: "2", name: "Guests at six" }))); + assert.match(markup, /tm-boost-clock/); + assert.ok(markup.includes("×2"), "the chore carries the ×2 chip"); + assert.match(markup, /\+10|>10 { + const { markup } = render(childCard({ design, boosts: [liveBoost({ child_ids: ["someone-else"] })] }).render()); + assert.doesNotMatch(markup, /tm-care-boost|tm-boost-x|tm-boost-tag/); + }); +} + +test("child: an upcoming boost is announced as the next one", () => { + const { markup } = render(childCard({ boosts: [liveBoost({ starts_at: minutes(60), ends_at: minutes(120) })] }).render()); + assert.match(markup, /tm-care-boost-next/); + assert.doesNotMatch(markup, /tm-boost-x/); +}); + +test("child: the takeover shows once, and Let's go dismisses it for good", () => { + const card = childCard(); + const attrs = card.hass.states[ENTITY].attributes; + card._maybeBoostTakeover(attrs); + let out = render(card.render()); + assert.ok(out.markup.includes(localize("child.boost_takeover_title"))); + out.control(localize("child.boost_takeover_go")).click(); + card._maybeBoostTakeover(attrs); + out = render(card.render()); + assert.ok(!out.markup.includes(localize("child.boost_takeover_title"))); +}); + +test("child: the takeover can be switched off per card", () => { + const card = childCard({ config: { show_boost_alert: false } }); + card._maybeBoostTakeover(card.hass.states[ENTITY].attributes); + assert.ok(!render(card.render()).markup.includes(localize("child.boost_takeover_title"))); +}); + +// ── kiosk card ──────────────────────────────────────────────────────────── + +function kiosk(boosts = [liveBoost({ chore_ids: [], chore_names: [] })], config = {}) { + const Kiosk = loadCard("taskmate-kiosk-card.js", { window: designHelpers() }).get("taskmate-kiosk-card"); + const card = new Kiosk(); + card.setConfig({ entity: ENTITY, children: [{ child_id: "kid1" }], ambient_mode: "progress", ...config }); + card.hass = { locale: { language: "en" }, states: { [ENTITY]: { state: "ok", attributes: { + children: [{ id: "kid1", name: "Mia", points: 10 }], chores: [], todays_completions: [], points_icon: "mdi:star", boosts, + } } }, callService: async () => {} }; + return card; +} + +test("kiosk: a live boost wakes the ambient screen and fills it until tapped", () => { + const card = kiosk(); + card._ambient = true; + card._screen = "picker"; + card._tick(); + assert.equal(card._ambient, false, "ambient mode is left"); + let out = render(card.render()); + assert.ok(out.markup.includes(localize("kiosk.boost_title"))); + out.control(localize("kiosk.boost_go")).click(); + card._tick(); + out = render(card.render()); + assert.ok(!out.markup.includes(localize("kiosk.boost_title"))); + assert.match(out.markup, /km-boost-strip/, "the countdown strip stays"); +}); + +test("kiosk: boost_alert off keeps the strip but no takeover", () => { + const card = kiosk(undefined, { show_boost_alert: false }); + card._tick(); + const { markup } = render(card.render()); + assert.ok(!markup.includes(localize("kiosk.boost_title"))); + assert.match(markup, /km-boost-strip/); +}); + +// ── panel ───────────────────────────────────────────────────────────────── + +function panel(extra = {}) { + const TaskMatePanel = loadCard("taskmate-panel.js", { window: designHelpers() }).get("taskmate-panel"); + const p = Object.create(TaskMatePanel.prototype); + p._t = (key, params = {}) => `${key}${Object.keys(params).length ? ":" + JSON.stringify(params) : ""}`; + p._state = { + children: [{ id: "kid1", name: "Malia" }, { id: "kid2", name: "Vaiha" }], + chores: [{ id: "bins", name: "Bins" }, { id: "dish", name: "Dishwasher" }], + boosts: [liveBoost({ chore_ids: ["bins"] }), liveBoost({ id: "rule:r1:2026-10-18", rule_id: "r1", starts_at: minutes(90), ends_at: minutes(150), name: "Sat" })], + boost_rules: [{ id: "r1", name: "Sat", days: [5], start: "09:00", end: "11:00", multiplier: 2, chore_ids: [], child_ids: [], enabled: true }], + boost_wake_candidates: { screens: [{ entity_id: "switch.kitchen_screen", name: "Kitchen screen" }], devices: [{ service: "mobile_app_wall", name: "Wall" }] }, + settings: { boost_wake_screens: ["switch.kitchen_screen"], boost_wake_devices: [] }, + ...extra, + }; + return p; +} + +test("panel: the Today boosts card lists live and upcoming with the right buttons", () => { + const html = panel()._renderBoostsCard(); + assert.match(html, /data-act="boost-end" data-id="b1">panel\.boost_end_now/); + assert.match(html, /data-act="boost-end" data-id="rule:r1:2026-10-18">panel\.boost_skip/); + assert.match(html, /data-act="boost-open"/); + assert.equal(panel({ boosts: [] })._renderBoostsCard(), ""); +}); + +test("panel: Start a boost sends start_boost with the chosen chips", async () => { + const p = panel(); + const calls = []; + p._callService = async (service, data) => { calls.push({ service, data }); return { ok: true }; }; + p._render = () => {}; + p._fetchState = async () => {}; + p._showToast = () => {}; + p._closeDialog = () => {}; + p._openDialog = (d) => { p._dialog = d; }; + p._boostClick("boost-open", { dataset: {} }); + for (const [act, id] of [["boost-mult", "3"], ["boost-len", "30"], ["boost-chore", "dish"], ["boost-kid", "kid2"]]) p._boostClick(act, { dataset: { id } }); + p._dialog.data.name = "Tidy up"; + assert.match(p._renderBoostDialog(), /panel\.boost_preview_now/); + await p._startBoostFromDialog(); + assert.deepEqual(plain(calls), [{ service: "start_boost", data: { multiplier: 3, minutes: 30, chore_ids: ["dish"], child_ids: ["kid2"], name: "Tidy up", notify: true } }]); +}); + +test("panel: settings offer stacking, the wake lists and the rules", () => { + const html = panel()._renderBoostSettings({ boost_wake_screens: ["switch.kitchen_screen"], boost_wake_devices: [] }); + assert.match(html, /name="boost_stacking" value="highest" checked/); + assert.match(html, /data-boost-screen="switch\.kitchen_screen" checked/); + assert.match(html, /data-boost-device="mobile_app_wall" >/); + assert.match(html, /data-act="boost-test-wake"/); + assert.match(html, /data-act="boost-rule-edit" data-id="r1"/); + assert.match(html, /data-act="boost-rule-add"/); +}); + +test("panel: a recurring boost is saved over the websocket", async () => { + const p = panel(); + const sent = []; + p._callWS = async (msg) => { sent.push(msg); return {}; }; + p._render = () => {}; + p._fetchState = async () => {}; + p._showToast = () => {}; + p._closeDialog = () => {}; + p._openDialog = (d) => { p._dialog = d; }; + p._boostClick("boost-rule-add", { dataset: {} }); + p._boostClick("boost-day", { dataset: { id: "6" } }); + p._dialog.data.name = "Weekend"; + await p._saveBoostRule(p._dialog.data, true); + assert.equal(sent[0].type, "taskmate/boosts/save_rule"); + assert.deepEqual(plain(sent[0].days), [5, 6]); + assert.equal(sent[0].name, "Weekend"); +}); diff --git a/tests/test_boosts.py b/tests/test_boosts.py new file mode 100644 index 00000000..e9314ae6 --- /dev/null +++ b/tests/test_boosts.py @@ -0,0 +1,405 @@ +"""Boost windows (#1100): a timed multiplier on chosen chores the kids can see coming.""" + +from __future__ import annotations + +import datetime as dt +from unittest.mock import AsyncMock, patch + +import pytest + +from .test_completion_eligibility import _now, run +from .test_family_care import _at, _family, _fired + +BOOSTS = "custom_components.taskmate.coord_boosts.dt_util" +CHORES = "custom_components.taskmate.coord_chores.dt_util" + + +def _clock(mod, when=None): + import contextlib + + when = when or _now() + stack = contextlib.ExitStack() + for ctx in (_at(mod, when), patch(f"{BOOSTS}.now", return_value=when), patch(f"{CHORES}.now", return_value=when)): + stack.enter_context(ctx) + return stack + + +def _setup(): + coord, storage, mod, kid, chore = _family(requires_approval=False, daily_limit=5) + coord._celebrate = AsyncMock() + coord.badges = None + with _clock(mod): + other = run(coord.async_add_chore("Bins", points=4, requires_approval=False, schedule_mode="specific_days")) + leo = run(coord.async_add_child("Leo")) + other.daily_limit = 5 + storage.update_chore(other) + return coord, storage, mod, kid, chore, other, leo + + +def _points(storage, kid): + return storage.get_child(kid.id).points + + +class TestStart: + def test_boosted_chore_pays_the_multiplier_for_the_window_only(self): + coord, storage, mod, kid, chore, other, _leo = _setup() + with _clock(mod): + boost = run(coord.async_start_boost(multiplier=2, minutes=60, chore_ids=[chore.id])) + assert boost["multiplier"] == 2.0 and boost["status"] == "active" + comp = run(coord.async_complete_chore(chore.id, kid.id)) + assert comp.points_awarded == 10 and comp.submitted_points == 10 + # Not on the list: ordinary pay. + comp2 = run(coord.async_complete_chore(other.id, kid.id)) + assert comp2.points_awarded == 4 + assert _points(storage, kid) == 14 + with _clock(mod, _now() + dt.timedelta(minutes=61)): + comp3 = run(coord.async_complete_chore(chore.id, kid.id)) + assert comp3.points_awarded == 5 + (evt,) = _fired(coord, "taskmate_boost_started") + assert evt["multiplier"] == 2.0 and evt["chore_ids"] == [chore.id] and evt["minutes"] == 60 + + def test_all_chores_and_only_some_children(self): + coord, storage, mod, kid, chore, other, leo = _setup() + with _clock(mod): + run(coord.async_start_boost(multiplier=1.5, minutes=30, child_ids=[leo.id])) + assert run(coord.async_complete_chore(chore.id, kid.id)).points_awarded == 5 + assert run(coord.async_complete_chore(other.id, leo.id)).points_awarded == 6 # 4 × 1.5 + + def test_overlapping_boosts_pay_the_best_one(self): + coord, storage, mod, kid, chore, _other, _leo = _setup() + with _clock(mod): + run(coord.async_start_boost(multiplier=2, minutes=30)) + run(coord.async_start_boost(multiplier=3, minutes=10, chore_ids=[chore.id])) + assert run(coord.async_complete_chore(chore.id, kid.id)).points_awarded == 15 + + def test_notifies_the_children_it_covers(self): + coord, storage, mod, kid, chore, _other, leo = _setup() + coord.notifications.fire.reset_mock() + with _clock(mod): + run( + coord.async_start_boost( + multiplier=2, minutes=45, chore_ids=[chore.id], child_ids=[leo.id], name="Guests at 6" + ) + ) + call = coord.notifications.fire.call_args + assert call.args[0] == "boost_started" + ctx = call.args[1] + assert ( + ctx["multiplier"] == "2" + and ctx["minutes"] == 45 + and ctx["chores_text"] == "Tidy room" + and ctx["name"] == "Guests at 6" + ) + assert call.kwargs["only_recipients"] == {f"child:{leo.id}"} + + def test_no_push_when_asked_not_to(self): + coord, storage, mod, kid, chore, _other, _leo = _setup() + coord.notifications.fire.reset_mock() + with _clock(mod): + run(coord.async_start_boost(multiplier=2, minutes=45, notify=False)) + coord.notifications.fire.assert_not_called() + + def test_validation(self): + coord, storage, mod, kid, chore, _other, _leo = _setup() + with _clock(mod): + with pytest.raises(ValueError, match="multiplier"): + run(coord.async_start_boost(multiplier=1, minutes=30)) + with pytest.raises(ValueError, match="multiplier"): + run(coord.async_start_boost(multiplier=9, minutes=30)) + with pytest.raises(ValueError, match="minutes"): + run(coord.async_start_boost(multiplier=2, minutes=0)) + with pytest.raises(ValueError, match="[Cc]hore"): + run(coord.async_start_boost(multiplier=2, minutes=30, chore_ids=["nope"])) + with pytest.raises(ValueError, match="[Cc]hild"): + run(coord.async_start_boost(multiplier=2, minutes=30, child_ids=["nope"])) + with pytest.raises(ValueError, match="past"): + run(coord.async_start_boost(multiplier=2, minutes=30, starts_at=_now() - dt.timedelta(hours=2))) + + +class TestLifecycle: + def test_state_lists_active_and_upcoming_with_names(self): + coord, storage, mod, kid, chore, _other, _leo = _setup() + with _clock(mod): + run(coord.async_start_boost(multiplier=2, minutes=30, chore_ids=[chore.id])) + run( + coord.async_start_boost( + multiplier=3, minutes=20, starts_at=_now() + dt.timedelta(hours=2), name="Tea time" + ) + ) + state = coord.boosts_state() + assert [b["status"] for b in state] == ["active", "upcoming"] + assert state[0]["chore_ids"] == [chore.id] and state[0]["chore_names"] == ["Tidy room"] + assert state[0]["child_ids"] == [] and state[0]["ends_at"] > state[0]["starts_at"] + assert state[1]["name"] == "Tea time" and state[1]["multiplier"] == 3.0 + with _clock(mod, _now() + dt.timedelta(hours=5)): + assert coord.boosts_state() == [] + + def test_upcoming_boost_is_announced_when_it_begins(self): + coord, storage, mod, kid, chore, _other, _leo = _setup() + with _clock(mod): + run(coord.async_start_boost(multiplier=2, minutes=20, starts_at=_now() + dt.timedelta(hours=1))) + assert _fired(coord, "taskmate_boost_started") == [] + coord.notifications.fire.reset_mock() + with _clock(mod, _now() + dt.timedelta(minutes=30)): + assert run(coord.async_check_boosts()) == 0 + assert run(coord.async_complete_chore(chore.id, kid.id)).points_awarded == 5 + with _clock(mod, _now() + dt.timedelta(hours=1, minutes=1)): + assert run(coord.async_check_boosts()) == 1 + assert run(coord.async_check_boosts()) == 0 + assert run(coord.async_complete_chore(chore.id, kid.id)).points_awarded == 10 + assert len(_fired(coord, "taskmate_boost_started")) == 1 + assert [c.args[0] for c in coord.notifications.fire.call_args_list].count("boost_started") == 1 + + def test_ending_fires_once_on_its_own_and_early_by_hand(self): + coord, storage, mod, kid, chore, _other, _leo = _setup() + with _clock(mod): + b1 = run(coord.async_start_boost(multiplier=2, minutes=10)) + b2 = run(coord.async_start_boost(multiplier=2, minutes=120, name="Long")) + run(coord.async_end_boost(b2["id"])) + with pytest.raises(ValueError): + run(coord.async_end_boost(b2["id"])) + with pytest.raises(ValueError): + run(coord.async_end_boost("nope")) + assert [b["id"] for b in coord.boosts_state()] == [b1["id"]] + ended = _fired(coord, "taskmate_boost_ended") + assert [(e["id"], e["ended_early"]) for e in ended] == [(b2["id"], True)] + with _clock(mod, _now() + dt.timedelta(minutes=11)): + assert run(coord.async_check_boosts()) == 1 + assert run(coord.async_check_boosts()) == 0 + assert coord.boosts_state() == [] + ended = _fired(coord, "taskmate_boost_ended") + assert [(e["id"], e["ended_early"]) for e in ended] == [(b2["id"], True), (b1["id"], False)] + + def test_old_boosts_are_pruned(self): + coord, storage, mod, kid, chore, _other, _leo = _setup() + with _clock(mod): + for i in range(25): + run(coord.async_start_boost(multiplier=2, minutes=1, name=f"b{i}")) + with _clock(mod, _now() + dt.timedelta(hours=1)): + run(coord.async_check_boosts()) + assert len(storage.get_section("boosts", list)) == 20 + + +class TestSpecialDays: + """Saturday 2024-03-23 pays the weekend ×2. ``boost_stacking`` decides.""" + + SAT = dt.datetime(2024, 3, 23, 12, 0, tzinfo=dt.UTC) + + def test_highest_wins_by_default(self): + coord, storage, mod, kid, chore, _other, _leo = _setup() + with _clock(mod, self.SAT): + run(coord.async_start_boost(multiplier=3, minutes=30)) + comp = run(coord.async_complete_chore(chore.id, kid.id)) + # 5 × 3, the weekend ×2 dropped. + assert comp.points_awarded == 15 + assert comp.boost_multiplier == 3.0 and comp.boost_stacked is False + + def test_highest_wins_keeps_the_weekend_when_it_is_bigger(self): + coord, storage, mod, kid, chore, _other, _leo = _setup() + with _clock(mod, self.SAT): + run(coord.async_start_boost(multiplier=1.5, minutes=30)) + comp = run(coord.async_complete_chore(chore.id, kid.id)) + assert comp.points_awarded == 10 + assert comp.boost_multiplier == 0 + + def test_stack_multiplies_both(self): + coord, storage, mod, kid, chore, _other, _leo = _setup() + storage.set_setting("boost_stacking", "stack") + with _clock(mod, self.SAT): + run(coord.async_start_boost(multiplier=2, minutes=30)) + comp = run(coord.async_complete_chore(chore.id, kid.id)) + assert comp.points_awarded == 20 and comp.boost_stacked is True + + def test_approval_later_pays_what_the_window_promised(self): + coord, storage, mod, kid, chore, _other, _leo = _setup() + chore.requires_approval = True + storage.update_chore(chore) + with _clock(mod, self.SAT): + run(coord.async_start_boost(multiplier=3, minutes=30)) + comp = run(coord.async_complete_chore(chore.id, kid.id)) + assert comp.submitted_points == 15 and comp.points_awarded == 0 + with _clock(mod, self.SAT + dt.timedelta(hours=3)): + run(coord.async_approve_chore(comp.id)) + stored = next(c for c in storage.get_completions() if c.id == comp.id) + # No weekend double on top in highest-wins mode, and the window being + # over by approval time changes nothing. + assert stored.points_awarded == 15 + + def test_old_completions_load_without_a_boost(self): + from custom_components.taskmate.models import ChoreCompletion + + c = ChoreCompletion.from_dict({"chore_id": "x", "child_id": "y", "completed_at": _now().isoformat()}) + assert c.boost_multiplier == 0 and c.boost_stacked is False + assert "boost_multiplier" not in c.to_dict() + + +class TestRules: + def _rule(self, coord, **over): + rule = { + "name": "Saturday garden", + "days": [5], + "start": "09:00", + "end": "11:00", + "multiplier": 2, + "enabled": True, + } + rule.update(over) + return run(coord.async_save_boost_rule(rule)) + + def test_a_rule_starts_and_ends_a_boost_on_its_days(self): + coord, storage, mod, kid, chore, _other, _leo = _setup() + sat9 = dt.datetime(2024, 3, 23, 9, 0, 30, tzinfo=dt.UTC) + with _clock(mod, sat9): + rule = self._rule(coord, chore_ids=[chore.id]) + assert run(coord.async_check_boosts()) >= 1 + (b,) = coord.boosts_state() + assert b["rule_id"] == rule["id"] and b["status"] == "active" and b["name"] == "Saturday garden" + assert b["ends_at"].startswith("2024-03-23T11:00") + run(coord.async_check_boosts()) + assert len(coord.boosts_state()) == 1, "one boost per rule per day" + with _clock(mod, dt.datetime(2024, 3, 23, 11, 1, tzinfo=dt.UTC)): + run(coord.async_check_boosts()) + assert coord.boosts_state() == [] + # Not on a Sunday. + with _clock(mod, dt.datetime(2024, 3, 24, 9, 30, tzinfo=dt.UTC)): + run(coord.async_check_boosts()) + assert coord.boosts_state() == [] + + def test_upcoming_rule_shows_ahead_of_time_and_disabled_rules_do_nothing(self): + coord, storage, mod, kid, chore, _other, _leo = _setup() + with _clock(mod, dt.datetime(2024, 3, 23, 7, 0, tzinfo=dt.UTC)): + rule = self._rule(coord) + (b,) = coord.boosts_state() + assert b["status"] == "upcoming" and b["rule_id"] == rule["id"] + run(coord.async_save_boost_rule({**rule, "enabled": False})) + assert coord.boosts_state() == [] + + def test_ending_a_rule_boost_early_holds_for_the_day(self): + coord, storage, mod, kid, chore, _other, _leo = _setup() + with _clock(mod, dt.datetime(2024, 3, 23, 9, 5, tzinfo=dt.UTC)): + self._rule(coord) + run(coord.async_check_boosts()) + (b,) = coord.boosts_state() + run(coord.async_end_boost(b["id"])) + run(coord.async_check_boosts()) + assert coord.boosts_state() == [] + + def test_rule_validation_and_delete(self): + coord, storage, mod, kid, chore, _other, _leo = _setup() + with _clock(mod): + with pytest.raises(ValueError, match="day"): + self._rule(coord, days=[]) + with pytest.raises(ValueError, match="end"): + self._rule(coord, start="11:00", end="09:00") + with pytest.raises(ValueError, match="multiplier"): + self._rule(coord, multiplier=7) + with pytest.raises(ValueError, match="time"): + self._rule(coord, start="9am") + rule = self._rule(coord) + assert [r["id"] for r in coord.boost_rules()] == [rule["id"]] + run(coord.async_delete_boost_rule(rule["id"])) + assert coord.boost_rules() == [] + with pytest.raises(ValueError): + run(coord.async_delete_boost_rule(rule["id"])) + + +class TestWake: + def _registry(self, entries): + from types import SimpleNamespace + + reg = SimpleNamespace(entities={e.entity_id: e for e in entries}) + reg.async_get = lambda eid: reg.entities.get(eid) + return reg + + def _fkb(self, entity_id, unique_id): + from types import SimpleNamespace + + return SimpleNamespace( + entity_id=entity_id, platform="fully_kiosk", unique_id=unique_id, domain=entity_id.split(".")[0] + ) + + def test_fully_kiosk_screen_is_turned_on_screensaver_off_and_browser_brought_forward(self): + coord, storage, mod, kid, chore, _other, _leo = _setup() + coord.hass.services.async_call = AsyncMock() + coord.hass.services.has_service = lambda domain, service: True + reg = self._registry( + [ + self._fkb("switch.kitchen_screen", "abc123-screenOn"), + self._fkb("switch.kitchen_screensaver", "abc123-screensaver"), + self._fkb("button.kitchen_bring_to_foreground", "abc123-toForeground"), + self._fkb("switch.hall_screen", "zzz-screenOn"), + ] + ) + storage.set_setting("boost_wake_screens", ["switch.kitchen_screen"]) + storage.set_setting("boost_wake_devices", ["mobile_app_wall_tablet"]) + with patch("custom_components.taskmate.coord_boosts.er.async_get", return_value=reg), _clock(mod): + run(coord.async_start_boost(multiplier=2, minutes=30)) + calls = [(c.args[0], c.args[1], c.args[2]) for c in coord.hass.services.async_call.call_args_list] + assert ("switch", "turn_on", {"entity_id": "switch.kitchen_screen"}) in calls + assert ("switch", "turn_off", {"entity_id": "switch.kitchen_screensaver"}) in calls + assert ("button", "press", {"entity_id": "button.kitchen_bring_to_foreground"}) in calls + assert ("notify", "mobile_app_wall_tablet", {"message": "command_screen_on"}) in calls + assert not any("hall" in str(c) for c in calls) + + def test_only_fully_kiosk_screens_and_companion_apps_are_ever_called(self): + coord, storage, mod, kid, chore, _other, _leo = _setup() + coord.hass.services.async_call = AsyncMock() + coord.hass.services.has_service = lambda domain, service: True + reg = self._registry([self._fkb("switch.kitchen_screensaver", "abc123-screensaver")]) + storage.set_setting("boost_wake_screens", ["switch.garage_door", "switch.kitchen_screensaver", "lock.front"]) + storage.set_setting("boost_wake_devices", ["persistent_notification", "mobile_app_x; rm"]) + with patch("custom_components.taskmate.coord_boosts.er.async_get", return_value=reg), _clock(mod): + run(coord.async_start_boost(multiplier=2, minutes=30)) + coord.hass.services.async_call.assert_not_called() + + def test_a_scheduled_boost_wakes_when_it_begins_not_when_it_is_made(self): + coord, storage, mod, kid, chore, _other, _leo = _setup() + coord.hass.services.async_call = AsyncMock() + coord.hass.services.has_service = lambda domain, service: True + storage.set_setting("boost_wake_devices", ["mobile_app_wall_tablet"]) + with _clock(mod): + run(coord.async_start_boost(multiplier=2, minutes=30, starts_at=_now() + dt.timedelta(hours=1))) + coord.hass.services.async_call.assert_not_called() + with _clock(mod, _now() + dt.timedelta(hours=1, seconds=5)): + run(coord.async_check_boosts()) + coord.hass.services.async_call.assert_awaited() + + def test_a_wake_failure_never_stops_the_boost(self): + coord, storage, mod, kid, chore, _other, _leo = _setup() + coord.hass.services.async_call = AsyncMock(side_effect=RuntimeError("tablet offline")) + coord.hass.services.has_service = lambda domain, service: True + storage.set_setting("boost_wake_devices", ["mobile_app_wall_tablet"]) + with _clock(mod): + b = run(coord.async_start_boost(multiplier=2, minutes=30)) + assert coord.boosts_state()[0]["id"] == b["id"] + + +def test_skipping_todays_recurring_boost_before_it_starts(): + coord, storage, mod, kid, chore, _other, _leo = _setup() + with _clock(mod, dt.datetime(2024, 3, 23, 7, 0, tzinfo=dt.UTC)): + run( + coord.async_save_boost_rule({"name": "Sat", "days": [5], "start": "09:00", "end": "11:00", "multiplier": 2}) + ) + (row,) = coord.boosts_state() + assert row["id"].startswith("rule:") + run(coord.async_end_boost(row["id"])) + assert coord.boosts_state() == [] + with _clock(mod, dt.datetime(2024, 3, 23, 9, 30, tzinfo=dt.UTC)): + run(coord.async_check_boosts()) + assert coord.boosts_state() == [] + assert run(coord.async_complete_chore(chore.id, kid.id)).points_awarded == 10 # weekend ×2 only + assert _fired(coord, "taskmate_boost_started") == [] + # Next Saturday it runs again. + with _clock(mod, dt.datetime(2024, 3, 30, 9, 30, tzinfo=dt.UTC)): + run(coord.async_check_boosts()) + assert [b["status"] for b in coord.boosts_state()] == ["active"] + + +def test_a_rule_saved_part_way_through_its_window_starts_for_the_rest_of_it(): + coord, storage, mod, kid, chore, _other, _leo = _setup() + with _clock(mod, dt.datetime(2024, 3, 23, 9, 40, tzinfo=dt.UTC)): + run(coord.async_save_boost_rule({"name": "Sat", "days": [5], "start": "09:00", "end": "11:00", "multiplier": 2})) + assert run(coord.async_check_boosts()) >= 1 + (b,) = coord.boosts_state() + assert not b["id"].startswith("rule:") and b["status"] == "active" + assert len(_fired(coord, "taskmate_boost_started")) == 1 diff --git a/wiki/Automations.md b/wiki/Automations.md index 450ab4f1..e990d7cd 100644 --- a/wiki/Automations.md +++ b/wiki/Automations.md @@ -256,6 +256,8 @@ All auction events carry `auction_id`, `chore_id`, `chore_name`, `occurrence` (t | `taskmate_raffle_drawn` | `raffle_id`, `raffle_name`, `prize`, `winner_id`, `winner_name`, `tickets`, `recipients` (no `timestamp`) — a raffle was drawn; `tickets` is the total in the draw. Fires even when nobody entered (`winner_id` empty) | | `taskmate_reward_delivered` | `child_id`, `child_name`, `reward_id`, `reward_name`, `claim_id`, `delivered_by` (`parent` / `child`), `timestamp` — (v7.1.0) a redeemed reward was handed over. See [Reward Fulfilment](Reward-Fulfilment.md) | | `taskmate_reward_owed` | `child_id`, `child_name`, `reward_id`, `reward_name`, `claim_id`, `days`, `points_name`, `recipients` (no `timestamp`) — (v7.1.0) the reminder that a reward is still owed went out | +| `taskmate_boost_started` | `id`, `name`, `multiplier`, `chore_ids`, `child_ids`, `starts_at`, `ends_at`, `minutes`, `rule_id` (recurring only), `timestamp` — (v7.1.0) a [boost](Boost-Windows.md) went live | +| `taskmate_boost_ended` | The same plus `ended_early` — (v7.1.0) a boost ran out or was ended | | `taskmate_personal_best` | `child_id`, `child_name`, `record`, `value`, `previous`, `date`, `timestamp` — (v7.1.0) a child beat one of their own records. `record` is `longest_streak`, `best_day_points`, `best_day_chores`, `best_week_points` or `best_single_award`. See [Personal Bests](Personal-Bests.md). The notification's own event is `taskmate_personal_best_notification` | | `taskmate_pet_evolved` | `child_id`, `child_name`, `pet_name`, `species`, `kind`, `news`, `recipients` (no `timestamp`), plus `pet_level` when `kind` is `level` — a [virtual pet](Virtual-Pets.md) reached something new. `kind` is `stage`, `legendary`, `egg` or `level`; `news` is the ready-made sentence | diff --git a/wiki/Boost-Windows.md b/wiki/Boost-Windows.md new file mode 100644 index 00000000..3ff24112 --- /dev/null +++ b/wiki/Boost-Windows.md @@ -0,0 +1,149 @@ +# Boost Windows + +A **boost** makes chosen chores pay more for a set time: "the next hour, bins and the dishwasher pay double". Children see it coming. Their cards and the wall tablet fill with an orange **BOOST!** screen when it starts, then show a countdown and a ×2 chip on every boosted chore. + +> **New in v7.1.0** + +--- + +## Three Ways to Start One + +| Way | Where | Good for | +|-----|-------|----------| +| **On the spot** | **TaskMate panel → Today → Start a boost** | "Guests at six, the kitchen needs clearing" | +| **Recurring** | **TaskMate panel → Settings → Boost windows → Recurring boosts** | "Every Saturday, 09:00 to 11:00, garden jobs pay double" | +| **From an automation** | The `taskmate.start_boost` service | Anything Home Assistant can trigger: a calendar event, the doorbell, a button | + +Use whichever suits you. All three produce the same boost, and it looks and pays the same on the cards. + +### Start a boost + +![Start a boost](images/boost-dialog.png) + +Pick **Now** or **Later today**, how much it pays (×1.5, ×2 or ×3), how long it lasts, which chores (or all of them) and which children (or everyone). An optional name such as *Guests at six* shows on the cards. **Tell the children** sends the opt-in *Boost started* push to the children it covers. + +### Recurring boosts + +Each recurring boost has days, a start and end time, a multiplier, chores and children, and an on/off switch. TaskMate starts and ends it by itself. The Today page lists today's recurring boost before it starts, with **Skip this one** to leave it out for today only. + +### From an automation + +```yaml +action: taskmate.start_boost +data: + multiplier: 2 + minutes: 60 + chore_ids: [8a3b2c1d4e5f6789] # leave out for all chores + child_ids: [] # leave out for everyone + name: Guests at six +``` + +`starts_at` schedules one for later, up to a week ahead. `taskmate.end_boost` with a `boost_id` stops one early. Find the IDs in the `boosts` attribute of `sensor.taskmate_overview`. + +--- + +## What the Children See + +![Boost on the child card](images/boost-child-card.png) + +- **The moment it starts** the child card is covered by an orange **BOOST! ×2** screen: the chores, a live countdown and a **Let's go!** button. It shows once per device per boost. +- **Afterwards** a banner at the top counts down, and each boosted chore shows its old points crossed out, the boosted points and a **×2** chip. +- **Before a scheduled boost** a line reads *Next boost: 16:00 · Bins ×2*. + +This works in every [card design](Card-Design-Styles.md). Switch the full-screen alert off per card with `show_boost_alert: false`; the banner and chips stay. + +### On the kiosk tablet + +![Boost on the kiosk](images/boost-kiosk.png) + +The [kiosk card](Kiosk-Mode.md) leaves ambient mode or the photo slideshow and fills the screen with **BOOST TIME!** until someone taps. After that an orange strip under the top bar counts down. The kiosk card has its own `show_boost_alert` option. + +--- + +## Waking the Wall Tablet + +A sleeping screen can't wake itself: once the display is off nothing in the browser runs. Home Assistant has to tell the device, so TaskMate does that when a boost starts. + +**TaskMate panel → Settings → Boost windows** + +| Device | What TaskMate does | +|--------|--------------------| +| **Fully Kiosk Browser** (Android), through the [Fully Kiosk Browser integration](https://www.home-assistant.io/integrations/fully_kiosk/) | Turns the tablet's **Screen** switch on, turns its **Screensaver** off and presses **Bring to foreground** | +| **Home Assistant Companion app** (Android) | Sends the `command_screen_on` notification command | + +Tick the tablets to wake. **Test wake now** sends the wake straight away, using the saved choices. TaskMate only ever calls those two kinds of target, and a tablet that doesn't respond never stops the boost. + +iPads and iPhones can't be woken remotely. iOS doesn't allow it, so they show the boost the next time someone touches the screen. + +--- + +## How Boosted Points Are Paid + +- A chore **completed** inside the window earns the boosted points, even if a parent approves it after the window has closed. The approvals queue shows the boosted figure. +- When two boosts cover the same chore, the bigger one applies. +- Timed tasks and chores won at [auction](Chore-Auctions.md) are never boosted. An auction pays exactly the winning bid. +- A job [logged for an earlier day](Logging-Past-Jobs.md) is not boosted. + +### Weekends and birthdays + +Those days already pay a multiplier (see [Bonus Points](Bonus-Points.md) and [Birthday Mode](Birthday-Mode.md)). **On the weekend or a birthday** decides how a boost combines with it: + +| Setting | Key value | A ×2 boost on a ×2 Saturday pays | +|---------|-----------|----------------------------------| +| **Highest wins** (default) | `highest` | ×2. The bigger multiplier applies, the other is dropped | +| **Stack them** | `stack` | ×4 | + +--- + +## Settings + +| Setting | Key | Default | Description | +|---------|-----|---------|-------------| +| On the weekend or a birthday | `boost_stacking` | `highest` | `highest` or `stack` | +| Wake these tablets | `boost_wake_screens` | none | Fully Kiosk Browser **Screen** switch entities | +| Wake these phones and tablets | `boost_wake_devices` | none | Companion-app notify services (`mobile_app_…`) | + +--- + +## Notification + +| Type | Audience | Default | +|------|----------|---------| +| **Boost started** `boost_started` | The children the boost covers | Off | + +> ⚡ Boost! Take the bins out pay ×2 for the next 45 minutes. + +--- + +## Events + +| Event | Payload | +|-------|---------| +| `taskmate_boost_started` | `id`, `name`, `multiplier`, `chore_ids`, `child_ids`, `starts_at`, `ends_at`, `minutes`, `rule_id` (recurring only), `timestamp` | +| `taskmate_boost_ended` | The same, plus `ended_early` | + +Both show on the family [event entity](Event-Entities.md) as **Boost started** and **Boost ended**. The notification's own bus event is `taskmate_boost_started_notification`. + +--- + +## Services + +| Service | Fields | Description | +|---------|--------|-------------| +| `taskmate.start_boost` | `multiplier` (1.1–5), `minutes` (1–1440), `chore_ids`, `child_ids`, `starts_at`, `name`, `notify` | Open a boost now or schedule one. Parent action | +| `taskmate.end_boost` | `boost_id` | End one early, call off a scheduled one, or skip today's recurring one. Parent action | + +--- + +## Sensor + +`sensor.taskmate_overview` carries `boosts` while any boost is live or coming up today: each has `id`, `name`, `multiplier`, `chore_ids`, `chore_names`, `child_ids`, `starts_at`, `ends_at`, `minutes`, `status` (`active` / `upcoming`) and `rule_id` for a recurring one. + +--- + +## Related + +- [Bonus Points](Bonus-Points.md): weekend multiplier and streak bonuses +- [Kiosk Mode](Kiosk-Mode.md) +- [Bonuses](Bonuses.md) +- [Automations](Automations.md) diff --git a/wiki/Dashboard-Cards.md b/wiki/Dashboard-Cards.md index c19f5103..80cd2d85 100644 --- a/wiki/Dashboard-Cards.md +++ b/wiki/Dashboard-Cards.md @@ -128,6 +128,7 @@ show_minutes_left: true # (v7.0.0) "About 25 min left" from the chores' es show_help_button: true # (v7.0.0) the "I'm stuck" button on each outstanding chore show_mood: true # (v7.0.0) end-of-day mood check-in once the day's chores are done show_weekly_goal: true # (v7.0.0) the child's own weekly goal (needs the global setting) +show_boost_alert: true # (v7.1.0) the full-card BOOST! alert when a boost starts elapsed_time_mode: dim # dim | hide | show — time-of-day chores whose window has passed show_description: false # show chore description below name show_badges: true # show earned badge strip below points @@ -175,6 +176,7 @@ header_color: "#9b59b6" - **Minutes left (v7.0.0)** — chores with [estimated minutes](Estimated-Minutes.md) show a `~10 mins` tag, and the card adds up what's still to do into "About 25 min left" beside the countdown. Hide the total with `show_minutes_left: false` - **I'm stuck (v7.0.0)** — each outstanding chore has an "I'm stuck" button that asks a parent for help without completing or skipping anything; the chore then shows "Help is on its way". Hidden with `show_help_button: false`, and always hidden in pre-reader mode. See [Help Requests](Help-Requests.md) - **Mood check-in (v7.0.0)** — once the day's chores are done, the card asks "How was your day?" with five faces. One answer per day. Hide it with `show_mood: false`. See [Mood Check-In](Mood-Check-In.md) +- **Boosts (v7.1.0)** — a live [boost](Boost-Windows.md) shows a countdown banner and ×2 chips with the boosted points; when it starts the card is covered by a BOOST! alert once per device. Hide the alert with `show_boost_alert: false` - **Weekly goal (v7.0.0)** — while weekly goals are on in Settings, the child sets their own points target for the week and sees a progress bar towards it. Hide it with `show_weekly_goal: false`. See [Weekly Goals](Weekly-Goals.md) - **Sick day (v7.0.0)** — on a [sick day](Sick-Days.md) the card says "Rest up and get better" and shows no chores due; anything already ticked stays listed so it can still be undone - **Make it right (v7.0.0)** — after a penalty with a [make-it-right](Make-It-Right-Penalties.md) chore, the card says which chore to do and by when to earn points back, and that chore appears on the list even if it isn't normally due @@ -773,6 +775,7 @@ elapsed_time_mode: show # (v7.0.0) show | dim | hide — time-of-day c ambient_mode: "off" # (v7.0.0) off | progress | photos — what the picker turns into when nobody's using it ambient_after: 120 # (v7.0.0) seconds untouched before ambient mode starts (30–1800) show_raffle_draws: true # (v7.0.0) spin the names and land on the winner when a raffle is drawn +show_boost_alert: true # (v7.1.0) fill the screen when a boost starts children: # optional — order and PINs; omit to show every child - child_id: a8c8376a require_pin: true diff --git a/wiki/Event-Entities.md b/wiki/Event-Entities.md index f55f744c..b530e795 100644 --- a/wiki/Event-Entities.md +++ b/wiki/Event-Entities.md @@ -57,6 +57,8 @@ An event about more than one child lands on each of their entities: a [gift of p | `bounty_posted` | Bounty posted | | `scheduled_change_applied` | Scheduled change applied | | `raffle_drawn` | Raffle drawn | +| `boost_started` | Boost started | +| `boost_ended` | Boost ended | Events tied to a notification (help requested, weekly goal reached, penalty earned back, pet grew up, raffle drawn) reach the entities whether or not that notification is switched on. diff --git a/wiki/Kiosk-Mode.md b/wiki/Kiosk-Mode.md index 52610eae..9e1cca3b 100644 --- a/wiki/Kiosk-Mode.md +++ b/wiki/Kiosk-Mode.md @@ -66,6 +66,7 @@ The card works best in a **Panel** view, so it fills the screen. The full-screen | `ambient_mode` | string | `off` | *(v7.0.0)* What the picker turns into when nobody's using it: `off`, `progress` (the family's day) or `photos` (a slideshow of chore photos). See [Ambient mode](#ambient-mode) | | `ambient_after` | number | `120` | *(v7.0.0)* Seconds untouched before ambient mode starts (30–1800) | | `show_raffle_draws` | boolean | `true` | *(v7.0.0)* Spin the names and land on the winner when a [raffle](Raffles.md) is drawn. See [Raffle draws](#raffle-draws) | +| `show_boost_alert` | boolean | `true` | *(v7.1.0)* Leave ambient mode and fill the screen when a [boost](Boost-Windows.md) starts, until someone taps. The countdown strip shows either way | | `children` | list | all children | Which children appear on the picker, in order. Each entry is `child_id` plus an optional `require_pin` (default `true`) | Leave `children` out and every child is shown (guest profiles excepted), with a PIN asked for wherever one is set. The visual editor lists each child with a tick box to show or hide them, up/down arrows to set the order, and a **Require PIN** switch. That switch is greyed out ("No PIN set — goes straight in") until you give the child a PIN. diff --git a/wiki/Notifications.md b/wiki/Notifications.md index d7ab8bcd..1c0336ff 100644 --- a/wiki/Notifications.md +++ b/wiki/Notifications.md @@ -68,6 +68,7 @@ TaskMate ships with these built-in notification types: | **Pet grew up** | `pet_evolved` | Both | No | No | Off | | **Reward still owed** | `reward_owed` | Parents | No | No | **On** | | **Personal best** | `personal_best` | Both | No | No | Off | +| **Boost started** | `boost_started` | Children | No | No | Off | The 15 rows from **Birthday** to **Auction Result** were added in v6.0.0. All of them start **switched off**, apart from the parent **Inspection Reminder**, which only ever fires for an inspection a parent started. Turn on the ones you want on the Notifications tab. diff --git a/wiki/Sensor-Reference.md b/wiki/Sensor-Reference.md index 8374354e..533d5a1a 100644 --- a/wiki/Sensor-Reference.md +++ b/wiki/Sensor-Reference.md @@ -46,6 +46,7 @@ The main overview sensor. Carries scalar stats and the compact per-child summary | `vacation_name` | string | Name of the active vacation period (empty when none) | | `vacation_end` | string | ISO end date of the active vacation period (empty when none) | | `vacation_periods` | list | All configured vacation periods — each has `id`, `name`, `start`, `end`. See [Vacation Mode](Vacation-Mode.md) | +| `boosts` | list | (v7.1.0) Live and upcoming [boosts](Boost-Windows.md): `id`, `name`, `multiplier`, `chore_ids`, `chore_names`, `child_ids`, `starts_at`, `ends_at`, `minutes`, `status` (`active` / `upcoming`), plus `rule_id` for a recurring one. Present only while there is one | | `family_goal` | object | (v4.4.0) Shared co-op [family goal](Family-Goals.md) state — `enabled` (bool), `name` (string), `target` (int), `reward` (string), `progress` (int — combined current points), `achieved` (bool). See [Family Goals](Family-Goals.md) | | `season_month` | string | (v4.4.0) Current leaderboard season month, `YYYY-MM` | | `season_champions` | list | (v4.4.0) Past monthly leaderboard champions (newest first, up to 12). See [Leaderboard Seasons](Leaderboard-Seasons.md) | diff --git a/wiki/Services.md b/wiki/Services.md index cbc9af6c..9f929c36 100644 --- a/wiki/Services.md +++ b/wiki/Services.md @@ -322,6 +322,26 @@ Approve a pending reward claim. For wallet rewards, deducts cost from the child' Refused for a claim that is not owed, or already marked delivered. +### `taskmate.start_boost` +(v7.1.0) Open a [boost window](Boost-Windows.md): chores done inside it pay the multiplier. Parent action. + +| Field | Required | Description | +| --- | --- | --- | +| `multiplier` | ✅ | 1.1 to 5, e.g. `2` for double | +| `minutes` | ✅ | 1 to 1440 | +| `chore_ids` | ❌ | The chores it covers. Empty or left out = all chores | +| `child_ids` | ❌ | The children it covers. Empty or left out = everyone | +| `starts_at` | ❌ | Start later instead of now, up to a week ahead | +| `name` | ❌ | Label shown on the cards, up to 60 characters | +| `notify` | ❌ | Send the *Boost started* push (default `true`; only when that notification is switched on) | + +### `taskmate.end_boost` +(v7.1.0) End a boost early, call off a scheduled one, or skip today's recurring one. Parent action. + +| Field | Required | Description | +| --- | --- | --- | +| `boost_id` | ✅ | From the `boosts` attribute of `sensor.taskmate_overview` | + ### `taskmate.reject_reward` Reject a pending reward claim. For wallet rewards, no action (points were never deducted). For pool rewards, allocation stays in place — child can Redeem again. diff --git a/wiki/images/boost-child-card.png b/wiki/images/boost-child-card.png new file mode 100644 index 0000000000000000000000000000000000000000..e9c42cc9a553118dfebadb378ce481d8d469408f GIT binary patch literal 133977 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 A@Bjb+ literal 0 HcmV?d00001 diff --git a/wiki/images/boost-dialog.png b/wiki/images/boost-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..5da5aec310e54ae43eb7730ad4cfaf4679d07864 GIT binary patch literal 63686 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
  • D*BY^--!cz{F41bSX8Lo z<$U>5DHSpk3|#RZVTuiA);2d^1xpK|0EE6E7Hj18XEcP|)&CFtKNk8KZvMS#kT+q2 z%oR4<8!Giv7Ap;1U0una77!xVVfkId1OAu%|E1ybPg3*$>*<889^`?Dpucdc6U0P- zy(2ptkuWERZAJwpZ~rvxKVJzTq+M2CSrAZ)MxD?2?{7~Hhl_&%*Y~EsL9fiLI1z?- z1-KK;jg$R$ms=zxVwRT72p7int_^AgW<&n#ep`Z@Ppx{DF0<6DSCs&L&hvpZ00?br zrDSzxz##Mf!-t=M$Ri3R8WySOt5-Kba;HFnb10D1#i0J{GL(Y4a25mG)8k#c#q@$b za0&Ov+_99x9M5R>gwjABGboBPtr6(1!U^h~-(UKW@kR#(+(NWSP#oQ04Z-EBb;Jn* z7pU_gr~&cNwTW+LAvLoOn5~x=2CQ(96F}3=ff@yX;y*r{uwe+)eIFvW>wr|iAbJYd zhXP6f2*JaH)ZP;S?OWD}4t<(H^BPRHEd3s8>!m+c;1b$R`m&vwOhD#mI-Zl&YBD14 z0g)u-DOKV1+z5FR!ulv5j2W;fJ4eOJ0GM481?A z-_Qr2Ax=^3OmoTLN&$W8J~eepQI}*ZAd;f_#E2)hYj;3(ZjB;7dx!53^({##k&cMf z5K)WBd3aRb;UnMbo)5UH2~zB#3##;RrKC0T*4ZyC&=v7%&$dOiMqNa{F1%uQh|tRa z%C=-_=3<1x4Ll9H6>9`$MC(kzBrKGF(FBr2{4DA;$;*C;M)!L)>ep-Lv*|kgqrCj; za;GBW9!J9p`MxQzd8|I21eY zSIIJXc_yjK;|gZ%6|)g*J$jda>*=k|eoB)2pfa50m0_MrlB@jfk2=Nu(T1P2M8oGX zpB*~H$*L-FL@$X^W@?J5$=1X z7RL(zquX$Sgf!gT!}(E8%hsF#;NO4zsKUs9&GlcT0k5vXpf}5gO|*#y{vplo_^$9| zmEFtwBVUVt7~Z#3S#mTnbjE=9jn|amCJL7XBGjBEhdgPbq$LLld;tjTNq%`8m0=@w zqI<=Ia#B2#tdJOw@EvD+=Qe6!jmn@;U^F$eer^nPtmCm6DRW1*Tsj zs1Ko`_`s-zU%YrxHYhi(1L^^q`}n&~WGi*o-)CXOJigW3+G=(5M)Ee|tUYl$U`EWI z*TC5;j(3Qx9hR|Mr)Ouu1S~u~IkX#dL$`(h@Hs4hNZ0RfY{aFdrS(pSC1MDaMSkAT zX-@0mnAHxaMm>=<)IJEFwA|QLmvlr|bXY80ot1%ai!ZaajE(=17o)p3+J5W+3g$gZ zN=E%|s+FQyQbs1G*QK`EU5DxPXR9)C0wJW?Plh|Tz&GSt|Al=7_6iCBbR<+wwcP%- zjg5&BhgB`Wv)e0(ybWIH!S1RAz*^9b)KSHL=JdwDC?D>Mvc$hLUMArKnX;{nLh!9j{fsU0T6EkSdUQy^fEI^{Yow_r0}FC z1d6`vHEQRw50^q6#{y%u=4gNOldrE9@PngCvQxhJjvKdcKZAxdJ-zMHF*`d8(V990 zIM=FwgKP}an8d~6Gdpw_A~Pyl^q=>+h8e_sHfa5YS#JyXQj#MwPpbJ=spJljZnlD} z=4l1=_3x7u1$A6z4@Tx#2%8pckNKZ&41>Z4se~-`S_~*1e@g9`K&!tG)gA~+tU107 zEOMYD@J8yAj|GnRAHpJG#sTxdx`ZS@uxl$-hFZHVvT>-$0`Yspo|xU`2Aa3Vz-hgN zpf$wshc=d`nD6E9e}hsq^wsK52(Ywi(|8a2dDQJUrSg!ElyXpcy&jahve})Zsqoy= zWnOjjP5Gz3>ya}ZDvzR~m&B7K)siWqFdJ=LZ&C;$TnxOhXP^cYg0+$Q$OS}?#+gh@0MUb`?w=sow4wNtXo{%qwkVr}!z1ll8dq53AeI zAj{DFv7({1rPcS`Z~M;B8et8*1d)CZ{AB2HZ}X>-^vP$gjmw~a9)VG5W`9r0>F;Og zILQ26ZyZpTPOTS?Xf#)tPK;A9tX9x~deGR!9D!{vL3&|8r>(pptDKU6KE1dt+`l5c zeENx8i9qLE8!i5jUx9P;U550W3l_nR)xTm+Vof~RHqlv@dTyN2@{z@Ee@FU<56AQS zR6xuiE!~^&zDC6AbLlEBB8LDL=r1rK1G6L%zNzG}oUf^=`ASJ?sk@x0^VfZN)k>E` zm> zE1|D;rsc}<83DYPskS~%X_r-(y_^zHkV3w{vbfm%^`W$M;0m>`(I0qe{g_tBpm zt*eWDnX}-I+pEU=M^nkk z+Y4_^ZMS!cl<^2ql`|~@emL^hO3{Vu67?JFM(zqv3XRGRxeaoDv&8NYI1mM_^5r|q zC(D4njPGhTS*OMtu|MHW|2U%6a_P?(hn1rGdBTj3-;sP=;SD-KGjUX!+S6115xjM7ky%E$KQG#t7|NAzge!L1J)A0G`p43`6jFAq zm>@O2xG2KU??z)i`h8<#V{Lagb5lhAFKT;tcE-W%L(K;*V9psVo^B!(|Iwh*?5jZV zEg2Sn`SMfhb+amjj;fw)&o8Zh@=z2M(p$!!EfTi>L|~HsQTM??2eVE&+r59(=CMxe z0LZU-d3h~FvJ@17&jK75u%eZ|6UcR0!R3*Rid4ykwie%Szc!3yRrEBOpS67S++wPv z-!QST@X!1iQV4%1a)BUUQ4DB1AO-Q(Hizu5K|x;v1E0c+ChWfWuf%p`=wrpjMurQ2D0TMlX5JPg2fPIdM$oBq#e%g91|L#WSL^3P zNT+j-e)!+1uGGI#-Q$vf!$cKN+(d(bFGIklV{sc|1@V2HY?1o{VXfLAzyX%Lh=w*X zEqi!l=HnBsyezh)+hkan<7gyq2UjC5W>gwdq_zko*NQ9sV7oaY#)Ky#JzJ9ckAmgt zP1+y>B6qzeBPBY)&V}y>&qa)rW73m7=>zy;f;Y9ECMPxEa%3W zz9Tn2!8isXL-p*p%!DMT=MWpXC7i_@y38722(Z{{p_2Rc=wE`QEWDC1Hj`+YKuY+V zp3SZz5y3z@k?nOT&`y0Ej_tg2uLr3@XlY1 zvTeOUC36;nR-j{jgWN5#*bB&?_-)_w1nUQ09Q-5_+XHqecbEq39&F>9bsI%RLKG-g z;B6E$vLioN*rK#$r}aS>39<#i#u{mcJBIOGj%p zSVI==+(>|My`D_O;w)WDDEhakX2XFzRC2<5+}z44l6R0VcK_=y_3ymGbZ3ZAFT~A= z0~_D>8`f#(0#*yBAjt33Wd^zhPBWVOIUv~~#IsWE=!Ld+X8%sPN~WIpYW+@uwf^4L z{>F6tgQ2nUfJvp4zV}1eEF}v2ci;aQ7IYAFi=+Db^((Y6pQNM*VCt5stlHjC68_tL zeFt?0F5zEkmrWD8sga7pGDf{u^FH_J`%LktuHxP?;_e9fa?+E<4Sus6x{OhaOY{Mk z=05I!kgt=oKW(8^ewlnBBs$vJ>^uPorGWkjeLn)$$s5p4zO2uj+9M1y8OWqy#|rT( z4Re#l&Tmv}=5IO)ozoBUTH!~#HXuS{n*6y@fA($k6<5jhTL z1g~g<|Jncu2g))eenLoQ)gf@5`2G8PD7IW&guQvD?9&&N6jW}9rvrZ?ABrV!>MKi~ z=n`p-e3)-4_MX@6;G@$O)$9LwSpJST1)j7|)BENPE`uqHO-N|}n(GJjN~qNLIXQ_0 zB_l^x%$w159aX;mlaLLfGoU1S?2FMHa@li3F%E-l#2UCIbL(cjZ^VtmT17tS_U-rL zNfy&;bktGe&jGlyv$KnvSg_ArVCJH~EvP0U$3Sw#y}oUlnfSeU&+dobYSQd%ntD=2 z9w-WQ5e9J!91TD_>?4}Dqo2rYMB@l}ezfQ>_|&2M3qtE4-N}>0^+O=!TZb+Lr?xX3 z*k>;=)6#bex9G}H3vdmWkUbL;Z{4^t<~6K(>*)CSAuVm%Cf;647v`G)ic|3Ww)VTn}877{bj^ zu+$0$iy+%c(u{~w;B=;>pMr*Ui->4&ZVRHB76=FhSioXW27)R)yfaGntPpTk#*D>c*c?ye+ zaeR4Md6FYZxD`K-a4Y;H=1XNeT90}goi!yxgIgRP=N>yBOIlCMoPKby6`(&NWH+a3 z)*L@r_1mbEmAqy!-}l1_Wvka?tKSX1T6Z!&(<~~nl#Pz1O$i;7`xHq(`x3E9fgDg` zy^Mqjp)iSs8HQNQyax2m1snmhOpVN8i2=~ZtJEG#V7dc2M@Np3AxXJJ0=dSD*sX0a zAR(M`bpTyPj;PNn1G5pmWVj88lQhn5Q&9~#%6zLAv-N-r26)ZfD&34;e;BMel?#dZEyc7YpNl0M`Q3J z2M?1jp=uF+>@LEO23YuKCm*|`hb4L`UI;_(kg{ahZ{Smr(?ZF0Lh}>e(<3H>-n8-H zH^$#UJw-fLq>Lh18dKOo`qk~}cQYT7SO30gaB-l%B=uE51{QHNfy{5%H3N~>>q^8l zGc&W|d66gqDlH4)Dp(%x`UOM?Yi;HevzZOd7&jsvdlSWJ z6A&KW!CXMQ_7-d_*o4V8Lb`J^-FO#5KJiW1`)R#HsJ*1N++w($)>b`PCH@Uo4J1g0%$pw}(PNOpf0~S5=K~cVB`7Ee2^{ubEDVg4?J5No z6>-q*k+?4m)*w&7a=!Bel4OA2;W<6pBrISG6GZ?8q^QT>i6dz=nSpO7rBt~C9V}yb z%h8ci0i7Fm<*M7^xuxbb+9lNy6c^iYEVePk>`ab&Al_O9GIcvF zQrIKtU_+xyk9P(ECsuNg@jgT?{ z^K6p$bRP@YwD!tS5h$=(rsD!hyV9zF5D42rS8J1d${7#I97z1ZU{!52w*#`DkUSlX z&-^eOhH0RigoI7-SOp-f|K-aU*k9|Qsz7L6RwGvigdq|qW5s-ZL2K)u(t2IG%zu{i zUG!Ke$(;A6@nBBsVkO)?v0IDkZh~BDwxYp_xoonGpK3fZh?14{yQ7bilJXHV51r$9^;yupT#6?)#cH4t@QXEDi$c-bW?+Jgc;}H??&gQQW_o5 zcs$tohb05u?O?Owj>+N;fmsxN-Onrc7|LA3l;8aBXb5WW{~+6#M);PG1&1Ps+-ivWIrxI;7aREVl z;p{r`lS;6EA{TU6&8J>~bu(#6sAMLALM9wwoMo+BTB4`8t(9$56dujF7vkcSY-}O$ z_<_?^Lx%ua9Re~c4$CZ%lvwFDgS?R_mmOx9A^4w93u0vr>}T?<}2( zUqAp9z+r<@nFs;X*@R}}0#25w62){LdXzaUnf}$U`ckSYbKUyXOBkf$r6IcO- zo~%<~y12NtPIi9>%Q{QPD_Is&xzwI@Eh5~Vio|SC?UE`Qhz96?;q3kbQ5hK)vKh7t zp?H-n(z8Ek$O_FEVdRm|q2j!H?XV~+CNIk&OO127SATW~7Bem6U<|)8F1n|VkrWXYR>;@Kfrw7Z&VIrMLC>4f7g}_vtHF~9bRX&xTzBF%v!+^Rie@~Y+Obf^I_y{%3%ZsYqJY)(h;0-Ke7m6N^ zaO;BV`H0bWeb}Y7ordFeTBf1Mv@9w@#wxo*b1?cU_gf>$nPWTLk#lB*#JU< zC~=Qk^`bEwA0YFafIX0A=gT$%RUHH9JY-vwK1tcD(c+3k)x^O40=}2v*?$i~2*i#9 zqfQ7^miUKhu(J_tVE8BN90d8xoeqgfT<9-tPYe31ht)XJUdURP3*S1@%xynp{! zkOYPZ?=mq3f=p{R>a+`J7#UxL#)Ql}!bK^stwZyAVm5Knq--1auOT!)$_^+HPe^{% z*ViL)WS;#g>|)FLYVZd6L9j$>(1#BnP>4Eu`}XZMaDjV@$spJZ;|Kguiy*}cLj{rY zgReslHUuws*g|p}LY51WBGs?;^TR<6%!NLNORK;Kunne>3gSm!Sfs8J!_$IMm!r*? zQ_a?JmQs*wA*#jTd}Ldn`5Q;|8x;gNQfl@GJ)u#+YneX1cL(Eg?*V7Q20|=MeOUVYf zkJNVT9HeL_=WHy%vF04Ud8i&zbVL4DNa?Yn=oi^4V7?Qyc27^wANk3P!VT!A zbo7S*kz--B|JNML)SUaKe8?sX`R=pU$VNQ!XOo3X%Y9(j0uzMXo>KOqh=7U;DVWk$ zJfRuy9Z|Cz0)OXMHoQY~ycgj?mc1)8z*HY|>HAf597Ts`F45f*1}u;{y4jiVaDN}@ z2{cTz9`bN8GqdbTH>H?ncCuJCyN>=*Y^;1QpU!X(u9DoXTTCO0m>tgBY*G6VxT9*) zvO42{AE$r=nkgyPli}hDLG~WEd3v)}i#6gQ9UUbzbN9RvUA?1gQz-4AR+RhpWID_(vB z|0*()xVpNUP)5wLX!^ntJ-uR{ZbxkCTKA8l#2~Um3*kl@8|Ub75!rvrf;Reok<=m0 zEFFIq$IRJJ2bgydu>K^(a_5*vP!dR|U~13A>guXB_S61lYmhIq6w{%9GapnBIDJy$XAjTy>ykOu0_}$e79rHGQ1_CRe!dYaY&qoHHDFI>BkYNFY zfCRvIc7!rBD|q=W7$aJt96=Q0%C&31np1bw@-fGa_fZ+m-qJ!>9V~>`*MHwI{@t?| z?k4imtzSqk?1PkdRN*U=yQLA@#y4z=D5s)-gr&mvlPvhpLSe{Ib2m8FguZAHnyGqQ z*_EqiVr1Q$5RGNJzHzr%hTlFpY-j@m+}}hFmC`@N*A!XM(!<}D1yiYVKf=ri8(NYo zLq5L0wh2~P>%WMG(;uI2j4Oe|U5zPUS9;f~s5A2u&GFHP8iry;xzn427&to2>M zUPy)^!lc~H5toRl88GzXP&?pTWa5m7&Dc_q@oa=)2AO^Vj{5H1d6>dI z5_Nzvu}|LKsTRDj^@bcbTk}jtM{pVq&A~q^3Pe;hCCUGb(HRu*mv!KMSumG^f--?P zX#k5TAoB<_7DL%(aa73cG)zQxWvcSlXP+!UX#6`sjXZ-sKQJr;A|e(Qtby4H`QY;- zP@Tm97c4qgF#nOX8z`Q9;DAEvH(DbCI>BSR4P+dz3PP4B=yU30m2PnT(IqRz-jL#Y z&I5e{8%Ew>Ds~S5C{aii@}^Nrw;PZ@2M-(gWAcw5Z`-4}x%S4~A(8C~Pe@8i3f$K? z7$EjDf)Soy6{p80$Pgt&SeN%Uc!3%X3u{v zS!rO^j79^@X>taE(w*>qF2=dou6bLyK1k-LftC;z zk_eOH@8Dsr&BcG_`1$hXOEcPv#f*|dNXg(csGqfP$e@BPmjzuL8f+!78v;&iS|qgt zVP8#{issXb1$}}RMe4LA33bsHgdvDR0}>%Ch5Rhibb)YyH38EQv`U5kpp$%~62_h_ zMecIiwEsr}lIwxAD>B?w;d~5)5SfC6W$qskAZ2hGnld(%$%3QP7J1IpM;zo@B+ie3 zqB^H;nJzQ1Q1#;@K4Ouz0r_d?=rUdCeux_QX|$*?^6e=)tYi|G)SlDkI*6I)V6&`&wcli{o{F1MC(5f*?l1Mh=IJfXNv-a zw-3oNkc@ux^41Xmf4MjY*TSb26WWt1ZvjsO4F)3|T*2H8`1)05mKEp#+8s!qtiM)N zR7|fatEs7hv6izr>5)3~b`!51U_|s`;=ZfUF>cxX3g!!tmX(c;<8!&Fdi7UJd$--FA=s zJ`7t!;Nl0HKRg0WAoR%OeA=4=KbXLEA1<+BvfG#<>;olhu(7FW0`~Sj3JQ0)C4f#x zNJfoPBDw`M`{%HKK-SJzR8F@OgDrUjb25idD6 z8at3wh>tZ+^kMJ-8S*;<{*0XM0F3(!u!Ij#O|rn@K!R_uHv5aMXdu82Qg!?M7Lp~4 z27eP1Vt7jVjbIqfN)`XTzBgbDwowD7q7TmF%fd~o$ zI-UQ;HGo9724fhQuYU|#;phPozpluCYo1+QFc@}gqmv+DwDtMM$%ajK)1I(d$4I_r zJ`JR*XLlX3%Q-O5aXfP7z>HSJvEQD4%^+i(ukn-S_8Y_7ifLaJ3@xuR-&kJ#B$r+s z>-3){!oW22BbqXY_$iZoDJas(X9;D@%@KQno3`ZYu z2M&GC10NrDzlNU|qBAB%_V2+hbPveI{XQ%YKPJW4Tn((Q+S*#zioC&l67F=Wk(;bKJ7T+|jnsX27woonK!1JNwmCGgt91 zhQpUqOP0Sr$H0(4bsn}Gl~;9enmWv9O)Q#evEJ{gZGS4}z{}06gTv`mrTtH{!E9mZ zpW|V~Nd=&CeknElo^sTN7zsp0))7J)8CH!ByPcto<();e)h}om;w6(WuYa}vGw|Nt z?rr|V??Iu9%6+=b6XWA9PKM+rED?>myP{dYvyxX) zWQitZfpM0By*UFV@S`EG7P-)<0)seE+dPF6CO~yb+qu!))MP&N9rk_5X{ubtf z>8ZHIqDEi!KePg}xHOP|HL&p+EHxmyKnJU~jZ0ikouP+-c4z6{Rzp&BcNJ=o889gn zNIf7vGQoibC#$C?Sle10f^`XLDL!J9*f2r_rzVJmi)6HkN?-b>f_e2>Tkz{W_SB2H z%H#}>MsXU8?_kaa4!(u_F{2nxK3(Rbnk;x=e~K)0^4mcV9r>|UgpCBpo0{~MM?yua zADC9+LNeG8LMw&j9E>(~mn;L0fD%m>$s;F5C&bQ*Bd@dwz;6=%X$GWR1mZbD|8N9K ziWe@^@nSnD`^Qv({$~gzwSD}^LgVyB(N!fq&LtEpCSistU0T8YbIF!2D;aSkW#&+w ze{gvz;~lR%PScrR?s`Yfzwz7L47*i~X20(2h+bWqHx*&j(jV3KGws%SOTv|v+d=}f zO&X&+T?}5dtTKEcNTnFWzm8C;q z;tv)!Nw1PRms4dopGz(uYr+{Y0E;o3yuqPFIs=gA*}WwMIsG+spaW0`QH@~c4Z)!x zI5>^etio#6UZ1E%6nTS;qK|+XkoY%(v^_oFLPic$>f$;}MA-+S4Ti*i!S9J7;@_V# z2R2p5^-G{dSuXba0y=?VDk>Tp4fwPph%f`ZQ)i8UxrYzpN%4h+g}u|hjm>RQoLw2p zoUroxVKxU~7N1tWo$Rae$;ld6n_>T<-%o;YfW!w}ju%xSij(EIZw_oj9tATmp^REy zlS42HWDDMVLsL^6s6dFh-a}cZ2-Zrfd?wmkfTGCoI}8wQ!f7qY@e7bffe|2J9|SP* z029H@A@s9w)W~1r2--FLN{Ad~DbOOS=s(nD)Sr9mMopK-E~VWAU?6mWPL)rd$#X)7<`%kuA{Z zRTo*JVPFotriN^dddNemfxQ6302r=-t+QaP2XJFYM+cHw07Bdyt_{}<5Cn2vJOBvE zSy_Mbw_eUD>^(j@LS~^*fO)6EbwX|inP_Zj5e=qO7S`9NhM=ry=wmlHW#XLa)|@1A zat$C7-Qi*uz@rJEzx3=J_supGK?bh{KnFYIKp?S-z&;m}`LP?U=qh}OyHe%=g24>_7wkP}M;y>a2$ehCSg zwX}HSbXEX`5|PYgW&f2v;`Ygb%Pz)xWTNKLpELxgF$bKbwHYLi?Y$xf(R1IvcyoP< zaNotDlcd>&{xQRoq0cT@x=)46Kka^wyfjvB^x#D!)5bw16?{MolY_*UuPS4IR^B>K zTQils4-C+m8Zk-+FSY)Syx^Bejj5utB$Vw;-?g@2*|q%!eB;m8)mAbIh#M?cLUL8& zzoq&0G5<0Ai6-IC{I(JWJe(cEwtk>NO(r-|0dQg);sF9cH&=<+gaGM2 z(1$`GdWAFL2H*qE!a4&@!yF_i*ax;SH=%!YKa~o@D-NMcaAE-%e5|YyzQCB)V0Uzt zIoKd6PWV{FCONkU5D%7$8aT_>2$_*72j;m_7DBNo>2x+q`qZ}jz;56lf5YafpM_&W z;QW>#293JzqGND25&H#^-e9{T!RGD7KF;7%=s!v@{S1Qv?*MN{%3m;RW$AmY*Le?x z9FxLfv(kcim0+$Hfooa>l;w4SaTNFz$YAeh-V=oIftbAs&_5t5s#S!(>>1dTz`D4$ zen0g)j`?@9=85uR*Vlb$IC{4Q%^ckxdc7MqMv{SV;ixE7ezb*vzm^-GYVoPnEp0F#T;%^`hZ z+W%?PR+XAsKQqiqYeYVKa2bFm659Rt)B`HRUD~t_k6|F((5$$&yQLAn4VeHeXmSvz z-<)lK0HqNq^C}!1fE?;2=RkS1&2CO7D7n|}a`F_mIWh_f(^Wv?Zou(gU@;;W^jC}( zj4mXzSpPGBm<@TkP|Xmp6FEu@j<9-;X{Fq}AT_v|mN7dAnlCbC zC;jpFQN?bO#0{sTHG41~>PHxWbv@=jMA5q_uMXx2+iJYJ-6x1XyLJXOtf*MX&djd12 z8g^i(BeFkaTZgO%jZlA$5`$GE{_NRBM3`PwJ)MAT*zECn>0}v1+4ZZy0}&fYJYxDI z!VXMb`>7_tW`L);2HpUp?(aMGc=BKk04o)bDG-WJ&b5nWutQF|;y57z=Lyz7iHi*! zQw6)}JWP?gDegkl2~PHa`89|@*q!XpruyDPo;)nVSU495D)LXobOISU2Ki%*bVA`0 zXb{koijV_A{^aUlIqWQb1Je<%{xJkz;X81q85;~psl%s1L%KeeZ*R2nJ!6Rx>VGQVNSXuvdD+*z&pC7wr82T4y4X9$1YR z)&@-~WF6{ylg?KEt%kq-xpE2J)^$fqeH?eiy*Q!PSX>^*u<&;5G78h3pl7eOaPl@z zRMA^f-|U-N(NqxjZNEy*9>5VNqH#ISiINU9H+Gr679R%3M3C?dW4Ve+ zW>LRVQk$$j`NDNEk#6ubn=feme@VnOMVOTLDzg$Htq7|JhY4a}L%^I;Y+ zRed1{D<4Ea5Vb*mKv9#agDMEWD=8`ItNN@hr{B!8hT zLe=TY=GD1I#uHgu%7p+iL>VwNq?Jw-Wj85HQT;8Knm^(+GcywaK}lF1ZcP>@!^QdW zKG5B#f6V77!kK)1qq}Jfdu=BehD}Eq_GT)wu4Zsh3=?QQh-p{PksoED3{`reI7L`P zxo;1$-H64QS-OE?Ult9ohzZOhP?MS=3%LiK3g)Hna&Ux$GoRbWjE94BE{Kb7`9v zrrF9SEf-g5@2oC7%zO(GcV1{Jz2xhEsXkiMRD)*o30{ zmkNyCjXUhCE*dK?^i&j3E{RUw00?X! zdO0#7=oR-Hk}(kWAzp;}&@X`eK#>(gP7PT837Zh9jfgFZz;Sru*!T)zF)&wZeN>`9 z98Tr+PB_7wiw|MzmoG!lTq{-c10@kQseFWP`nRW8i>cx!qADLfJfyb?KLf_?8_+Ax zxPz#2u)CR{#rqMnS3}!FWM&|M;z^U4aJVX{U{k$s{y)~<1g^(+-TTfw&qGRP5)nd_ zdF(btGijhig-9h0W-^wsqLEUmR7i#fv(l`TC_&-<>= zT6?eM*1zk2UFUV4$MKtvEw)ZUITi!TiFI&_KD9_vF)KuA*?A%HT@a|jg)RkPCgEzt zq)9jQj6Cwv?png`9M$OUQP)?oZcB2LH= zh&WP&cV-C@<($U>nTN@UxRyBZk@2;!uQvEqQIur;NsLvtDm-BF=G!+Lq39u#ZsUwY zp@WD06LN5-W!rY`a_^){O>W+Y+O}@3|LpO07s4{KZV%7yl(lh`V(#x_J=gpUncH!! zl5gd6&&TRMf63$=8MiRuUATHw>3rYki85~$4i}ABUodrtGpdj@~34trEE4nv<8>8lg*?<@Jy_mBAbOr{xz| zDJh;1-FvgMvn{&S)8q-06KsLdKoD>At@2HO_{qD!8aJZtoQkDw5a4vUc|Fo&$l`9e zhUwSAI{E|Xj*^oTVkLI)>tNi-`wr=a3lW9LluYxQ5{0>H*YEhX)@@gfaaTFCkO~yR z(Q?(=8c3Yb+EdE9Dei7*o%iKtN@b!(k3b3VzPn;M@ zt_Nq*Hep+-FYH9WAxy__Vr)%{5?qMTIW3ybF{=tMw*Uwikvb3TSD)bwy?=kUh*0EU zdrE!yl7^9rY}mAE`I(({^Obdd=&d?HPpCvL3>(tCKw&bH(Fv)NA4j;+^y!o&y?_7u ze(%){^D_a%ta5(pto8(r=0zBe2bzsM%Bi8ct$`N{vqHrkG!HQg7kb_DjfzBKx8X<% zj`ook&evM^P7%+^}ocOw?JB(-im^uZGIYA0x(+nB)wO zxintQilrMlcMW1}hD?}n3i(qtD9+YTFDLL2D)gJ%CfgaRB=}_TcVAsy+e#D}EaNWe zcIQvs*`*M2%KTrvysu=5K5J=Ms%FZ!^owR0=Bm z{bVu%<0D6AB;5SK)9^zlj==J9U+p&EE|F76*I#$qov8DXp(_Iud^C zP;ecw!YMjVsQslPO$I36C9T`7H{1Ku0gM`1MQnA*Jh7ExgS29D>M_7mLIYLm+W`$pX;$42*FKW zx22oWS=3@8nC-GvJg1K+OzC8l(TgE&+NQON)Q>a_#sK99-dF|;{n(Bo7q#FP7l87F zD3gao6v!P46F9YZAoKx9yU9gSR!J@Z7rCN;=QO>B$*p{$m!d0{5dA)0wo~BwxT~bk zI^VPS*yO8d+L0n~)2r(T;m|tp`f*o2UQWAQ;Z1{_EVMxM%B-`eWI644!D5iv)3@lN{rEk{Gh8L~bnRGZ)-p+^-F0lvCtzUG$wm2-Lee<>v% z@xnvSS=n5#d=)hkDbGj*iZc+l4B%2Xe9R814Z0QT%`-jzV9h%!0K0E{LpH85uyFLv zsg)Uk?hys8Q{Af#H!O0FqNr%w#zXPYaclkRx{Y4`U$re}B7LZG|2`%sY315s${COA zx6d)NkSY(9>xkQ;dSSK$+}Ph*3?-We{nH-HRI6hf{wjz?hwS>q*sAH7BZtQ`i)a|) z;DXIQK)w%e8Ew=W9n(f?YTo@J*}DG!<)TVf+Qn^8)R*>OZ*OnU5t(cMT(=}};sB!s zZ=_GZ-S$~&ELikaQU*lqo}fs1yomrWGBw|_6VHndOvfPWAJIjSc|g2OpvSqY7Z!)> z!tQlQXQ9TvDY$U)sqX2*LgU2!u`_XH%N-qRZ{I@NQ+)aWK3%v;31<;RC8*9jT>4%n zEuX|px^(>DF;Dle^!l-2auh zN$Jd)GtV!KUYV4VaHh#}=IQSqvj`Z$$q=p=eLAn-$lF)ULyiV7Oq(3u^wLjrvEd!- zfO8S8@09epR4jEz>EYY*!EHyE9lY%DWcFrjMSXLy)2B&EV1HNUOo=ZxE&6NMltD>9 zQjD~vZkc7y-FL3-*8h<=5;4C|N11VB=KXk^^jq4i8%Zu+Uc}EodHeSFQSb2~76lz) zHz;WXwm2j$Df{OGHQlP*0r?gQ|66ejkJxBGzujF$dg8vuym1g{E z9i4?ZT%puB=)N^J{>ZyME$Y?rOtVXIao+du-?w<)WOP`5!Z@EHe-kGWql@H|7Ia$| zy6*hwzs5~Iv)XVkkpNnWoqD}FKPN2Vf_ASfxjjq5f&(8+{`?$Xr#V<4s>ooxM}PV> z%v_PVATk!-w}M9Lcd#$-{11Jy($r~$Fx;md*ikE@M=Fau^;z%}*H+0wv!SOwBt44l zYEH#TdUP@$E`mD_jKEnc#Oa6ujciL`#5e3xAhQmm`3byKulU*^t&S4I|8Utiz7d-tsmqGFSG zzG+gZn=!T|e|*H4LF(oHOAl{|dIb;yx6-|5&wV=iWBSbTZ>#g~0R_9JE|Q8p5voWu zkL0(Zb4JxHIrI9t$IYP8;^$L8t^QXQLG|M5B`ay~X~L=5-@nhin$$7y_!~|B2nhJV zp+if~8#x#I-o0V)SHt1oRt@=)|H>UmPTP8mVs>6@>6b^L8< zjhX)I(b$npg037-u5TJ2r>H(8Y9 zqiZ2G#VtXDBLi3Ihn9G8a?nvJ^E9L5qi>f;Pk^}QPP;v#nZd%Z2pPv zP{>(`+Z#uA@)0HgklWv^@}t9V4g(Yo`kDv(I;FPAb%0|2!0t~4W}WmaT5l|we1Hs{ z+s<>T&_8M#N0yY3b5O-}xesNZgn&CkgukIykT^HPQAt1xe0?;w%lP3$WFHYuGm%2nxHBALCT)iE$h#d(*R5+t ziQqK!YA(t;ey=obsBTUjR4AWPytLtP9wtZgrE7)0rhk8Wk3tZewPY0tnTBhLumG_B zT<@WwaRIbMw*Sa%k|MVsW=&`f!F5ZXNE%&vk6G1 za097)ge&&KY)srnU*pDfsRc13z|8u=-p-RYpBKy{*Jvdq8#L$Oq5>{PaRT69x9|DK z&Kqik6@SkDw%W0Eo{t2*MfI?;^E%JMJd5P&ogXe9x=L!*yHBbuN2`ww$3Tv(h+9|*P=*%U)ve?(7iuFu&FP-E?ak||8`!Ezd5EnVe1zSheWiV z2-Z#kn372`F*atLfkE_UWbPtKd`IDtksrwTmcU(_>NVvAN>1gvb|PT`u`*yO55yY$ zh{#f9>U72{V60K|o0&!%y*IhjE_9@#H#mH_J>XU4ZDou(B3EY)a!1iRfOVG{I0?)U zE_6LFB#3xURYRw7akJSLMfRiwk)Na4BjdhhEh#GzNIPkmU5SasPJfcOCLq&Huz-R@ z5p_>NoIT2cT+| znX~NTNf?d79JbBc`pD6v##|gFkMGX9RTr*1S5nnL%Upb+xEoOt(YO-q-_25_tQvCZ zzv59B(i|()K`cOCPm=3?#l`){giV}UrGXxX#$p=4n^;NAE+j2J7DO8FQ{Q6;*=$h* z35)7fr~2_gGa^u#of?SXl0~kOf#>zq<=#_U+~0ibjq|;G_lE5W&)ZE;g+8lcqkyF3LuB3ZZACeHGR|NIvoGaV-j{lh#cVvI{?_NS6lP6uLHVoIp^J z6HJrOT9g^Bj=B5$m*dQz-!y%9|FRbg6wO-u4jmpmdL$B_|A{RX!!|NvZ-T$Pylo{6 z;vxlVJ?rzYSw{)>8zjl)8B;x!r^3Dg!Xdx3Fc+~$ZdK^J=f>3XK^Om*)|H?>$ zZUh_WI_NAB8-wW_=}d&~-T-l(NOVboXBO=TA!mpMt=X=lXpnRw4ZCQ)NClUO&9l#T zbEjM0FQ&S{+F)NeD=$oNnMl@-0qWAEk~F z2(>YmwoWQO=~n70>@G)dPCabu(N3%z!9Dv@?orrUY9$lY=V zzXXjh;Ty4g`UeEycK@GT725;OrG13!3C?sP=&>+1vL5w6PZd8++-59J?^P*8|Sn9g()>(_&YN{+`CZWYf6m~EeDxrf&ED2hWpi z^{X~h7^CLw8s%<<^nm*MQeYtUkI3aD=&BW45)kQWcXwwh01V$~#QG}e|Aky?2R0$b zSePW89wD@Zc9r@Uu6sJ++OBoC$FVHYi1HUch<9PqEOSh^MC&i-!=WUjNz|04sp)388Gyepzz6NfLO z5klM(%N8$RUPdl@;mv$Y6KWIJ!9~QjinsK@f!46$%a{%2lAr4y0aM#^;J|cZ-NYLK zULw=*)@JLeRD?3M)zN(N~E6j89CKfJBcZ54A39mi6D zwH69q*djm4el18M$yDE2z_^e^Nz7=`tWC&njvu#5_p(Y!R-r1e8re4DfPv%w1iId}BQ& zRJ8ARhDpuS(&{a=y9}=pA^dFTiQ5*aixEv?YD(L-#PViPdQ!7pG4a8{+Cxfe5i|rZ zHo~kE)TdL^M+_b;u|SjqSQf&xe};$^iO6nZ}xrK}va*^>!=O&r= z#6uFUld>@~J^?Hp{4eLVKHV^xj#$7RY*Io*8b|BRWCdmmS2}maH`)54E&d|@ldc8WH{k@)x7ws(WW_VK9rRSQ~Oc>sX2Sc z6DfB0W_d)9M((xCbfW73FkPxO{1;AzsHfRXl`HEa*OG3<$`2SF&RQX)R? zT?GSSA`Q)B#)ueF=cBQqP5U%#3T zE<9Oh5W!dfVwjF0(A^`w+edpqSdb}u`ECNd#84nY5xc`=A_Fe8ndKLxP{V#9P9Pc$ z5m@BsRNaA_>}vF|Z2OC@-MW=QYD^v&74#dMUgFLe8Y|T<=TRS$e_L=v+s$_8y**)K z;2B{Btw(z)RcIK+;PO`EiBYpm{xv?Nyne;2IPxzZKRnop^Pf}s87QyHty#L79xT^p zqJ&qY?B{HFKQVv{5Z)Sbh>A}F3Or`zq^6|M7iU|&g<);w7Hw-gw*SIuER5NlDlw4KdKw2F9o z7NhGd)>=WqWn%JLVls^9Dqa?CVz& zW@^^*NGQDrl88X-;3cjW4tQ(k~ zRL`v4zJ2@t$S+ai?GIv8ru8C`?_`O*60WQv?r&L z9&W3UlAbOaEg@T{%5|m#tU{is6;`#`Opo>Komcmt7{Ab{-7DM@CVf7#SfRsjHs-#^ z0@d>us;c(t)$0-U-RjS|S)!qbpO^VvQe6D(Uh@>kB#!4qo`{Um3$(9gKl2VH_m8H6 zf+A8;nGMz0t9y50+$~xXK_f;kWi_r-Hr7XcpL&!~dy-F0p}rRc71Xylq+@I=WTxz< zqT|q8hp5NZ_0sMfj5P4d4e&kSkLU6MrP0$2rg}bVh27Xjg|)#uASfI$ zjE@RMs7pnS%;5)?HkSkjmfm<_#g;m#EqbtzY*N=7-OF?GVF7GXO8=PsE)UjS{w%6WVbf@=%_vrZ6 ziJ}9LfgKx$NgT6KUD#+2uuercB`oex79aJu<0bj^^ULlia0{N4Uigcu*I_ZY?6?q< zts1NKyraZRxJvvGVx^eTZ@qVo9VC| z$z7(rzCY~5^oJ-8#f=4aA{$fWiRg_x%ztwoI74sqa8=&@S9f>D4m(K(*MH-Wny7V% zJx(L_R@{CXH`h}`cH8D}z9l;5#HWGQm}*6}0!%<2Q*`M(o{-o^_+uffpbVetwp)9B zn&%U^rX3}2y7;HWpuEX-S&@r&me_^3UpsWD9lUl4K~V_C2JR6q-n_?Q7P4qhN!*lU zX4_YH%4(AQetZCD?i9H)fX$q9Ucq^0$#=jPBSM*kYej|sUA zPokRLU3sB0@JmrynQqzLL{gHuAQ<~XvJZ-JT&v9ui0m2+JWJuYw~xHeSM;=E7F}KCn-rShjhhr>5D5wl0!~k; z=pa(2<{Z}v3`x#qE{?Z%=dA^CRLWLcK;avG4^2ia+Nzr_hhuQhVhQGJiA5z-U)f4?$l5E|8fMUAN?vVuVr7 z*9uyV(DXgE8iP$MiODK%-+64`PV7&`Vw7f(m!(C)ft-2C-?K`=5k3Eos{beE?}2?( zq+vPuHSLlSQ59zURUQ~D{fC8`r|o7%FB`RdxU7QyyyT|EcO%&{jxvynOfc6ut;$?y z$7(HVFwFBFB^rL)Q*})ICBjidqcC*d?LeB5uON?BWL!`6ysj_;*vhq?-cD}hirx#7 zU#3mIks4Y2!-0L33UjJ+qhKw|Y**aN{)>{-l?#wU!xzvqt0-U^*BGNnO{b3lUoL>s|G{vE^5#4u5q^u-lMX`CD-5Q)>eJ{cJ^Uh>LMv4`%9_gwrJcf)EMF7E4ZMo z|L3v4X^Iw$oU07<6`Pjhg)RBm%=Ac(`FEzLXo=2k*Z-JLy-sJ5V46Prw^l?m%s43A zQuMNB(PB|3NXv`~%1=ZE1G;6jjlck{8nW-e- zZJ5HIe`uILlcCyYu3=~yRXHk%YUkxs#5m^WOlKuK4dEwjYqe-F8v>gzQ#o!Me~y-GICLgcNY&0d`Ps2dnDFD zdgf;$)^?fAFi{T>2sCNx$?~`NW&s#0EY>dK?Pr*jZ1V`{TVmjg@wIoj+_PgSs_2+n zxGmEVs5FQo>9bOM1Q7XR#C)Gq!e+$icl4&@`5qKO)!h-VV&-u8bHg1^-(vk2Mz zTU(4A62ptAqy(tI(53&3ZGOuB_0d1mtk_npgV#rwScrGR!uFBzB~Ad*Zg3|TuxY2S zzDv{wi=0NzRxNC|05!M1n=JuaIB(lFMTo0+zU{cCf2G^5V1T#f&-Q>&!|zE><9D&vuFi|)?HFk70WmW{FMpu(Vu_wbn5+%_RT z&scre?u#MS`NFw#_dPdCmY~mo#W;h;_nq0pmhJyE#I_2p@Yr+|qYtt6L!VEi_z=Sr z%dFT#ByjPEPjN}Fycg=6!r_m;k6MdMm~Hyb>{dRQg3ID942690PC|=4#7qs|DAZHV z`zLXsON;qRX#T#(CDpJStpt$WiAjwllG@6O*LUT3edv!#o9R4TO|2^upO&LXR)lSl zn$59|Q=lFF^Elc76ApASTq(WlUG1Oy1rM<2S>$xNm+jur)KR{_rD?Z=YA23lkI5yOYw#IQ~~r?0QN|4D#T1)3j)JS|?F?@AocILZWk_?~q|1o9w%L z^N(39kZ}9H|E(_nn`d%(zIxF4c|tf5s}9FEif(;bj3xy`YU=PYV^YiWBr@ahf&87g z{OY`zGjm((5>tWJ*GDf7daI(d9%~=! zzU&fd#yyawJHE7tag+yEZ)^Cpf#wAI5z7-w=9A}5#3P=bS5PJkH%$>ro{5^*1u+l|uEJ6J$u?c$M{zqB3u8ULA3#RQlI$$L|9MET~o5+7vrEeoD&@7rz%wJA62P zzk&LSYkRwBX&o)>X4LL-JG&k4;w(D$@N$ffT$U#WZ<gi5bp)|&0L8d#C|c=_+eU_ z3rDNU3&aBLxlt;-t{dq6(Q!ba-3Nc9$}HwHgMsG$ZVpuf@|r*0*jwq)jCegbiM%mz+@`aI?@C$g5)LvM=P z@7X=LjUv?zUYS;6#E@_?R#v9N`qFk!;~kxxej=p3CBG4<7dl7p=B5t9kIi|3^g$); z&-Kmq&KstQa0LN{NY0P|KNnpqyN|BtAk8zpVNgKgu~EF7baMm18tbjSS*+YiL)1F0 zqi;K67&%f|`BjgnLKXrJw8!DiH5<_QB0}e3okdh;#`K!b5<;e;6D{&#G7n50dlKYc z_;bJl#2g<9F(!!5Hp{;`mJPzTRM<)J?9F9uiD>}f0HRoPy(kLGx%zop99E0x&wtzy z(L7md{(csb?{D4SJkaiQy+{2~b!D#m6O(XQ_HVh@q*Z?=aQi3y{SGa2|C6R|cKwh3 zYyO$PvvfSi{PPj!8LAh}17&+2J6_yx>{-1{{JShb+9lZ_EWsd5_L;Wof#6PQuWi*v z1(UG^hfa;b$l9=+k7u`8AWvYb3@6aL%1YO;urST!J7@D4P+yqp9YtNKd02i-(N@b* zh7MisI*i>MXJC~Rx>bG3PuGiz$GQY8yZCI~h|#wWgqQ2YG~Rh$kk}_&&sN8tTm;T) zs`1+~F`yayf`fyLhB`(dXy!@Fo;gCrNe4(DFE$*v#m&F&werYuE@Pr!uJrOg#H?Je zd($fOf(G5r4$L+#TB9~f!sLK`YF+Vb8jM6W)v6qhB%O4^2 zSYrN;m}evI?_U;j@Z9Fb@wrj2HWBO(sh>Su;getn3E8A>I^zG=YSzDBd^_K=HDSC(BzEQhM)_3PK^bJC>!yuA9OyFrzp z;t}8cEd8sLnM0i4n~8DHUi`?CQ43wfRq(&oga_(k+X7smcbl=HHji-{Kr|QlS7!CM zs;VIn6fXu|uE~5MM8J$3n{44*YaYh?QMPsQ;4>PV9vg%`SfKg+bI2;wzItQwbW7eo zTCFxUz@p5}OUET_VOmm8O_vmSb>gxrY^N;cO%b8(c#uZ&$ypniBPYDWOeta5R)s+# zy}!_Fpzo-NSF?p8ZJyq|qDZlec?C#T8u|del2wY(7AEX%(Gfp@ajU@Mb0Z5kT$m}I z`g<8Qsqc%%PVQCw;_8(zW)&GZ?{~T0oA)|>*WCll_C`4!SQ5}_d+sSci=e>ZCDDHU zJGXuP=1u>z!Txf>lz_}RSxBRAP7L(}o&(609X`DH_={O?US6xiKb!xx`cP-7hg{wf zSJxowD+%Gc!6G%l?zMVF41D=;$bz+QTQ0tWX&= zaBLn>-P7sLKgRqIFETJXRjvo@W*Sy%qN9S#RtQ1VOpzj$PE9=G3v?mfz?Xd!rv za4pjCK7RAYM|l6KB+=brMJyXbZ6-}Y^CKbPXH^+V=#@Xe7|r-dD8vwv8>=MTLSZ#_AqrC+l(Gem!q zbm!=}(?kF()eqT7VN%eUZa`Z*ZTa-7)*Pf*39ct>b6Ge{ zoJ0}=zn#6m+RW_lo8_=>sZxKHWwf03r$(Naw9l%tD-NI0uYc)&!|=i{XWH0QTaQRI zD~WNxyJ`BWzZRZ9@0V~RIR1qEE{86;KcybMpZ-IpjZ4Rwg9;KRT**$>%y2$CH=^Tr z6FZ#= zPh__xkGZmZ>^j5WTO&Hxm@e%!s4o)(WJmcW8SJar6l@sqa9x=4Nz#!o_peWOrrr_a zE8fW4WOKa44F<9C1U1sN<6&X)LVX9y%Gm{2G6+~FL$7AW8C$i$OtY(#jhkQ9d%u4z zp@9G-7a~9T$he++_%LBxMM%|dHfCW8kDStg9E&?pb`l~9SXhwu*Gx4q_m=g);At!Qs>*-@YTk9Po*|@3~`Rx64rM7s?8rZ-r2!n-PY(G&sP*b;O?Sd$H;q( zt@EV2d+Evq-X7e!B88rU5Ol@1&e=OjB^aw_^v!^an?LiCG3OOwUOQ0D8+zdZxk+@b zyoEJ1a4R%47@)Ad^PHT8#N%9BnLfJP<=AivIPXWJ_8#}r+5E*#J@>bN?!$SiezQ-E zF3(+9KVid`jw6?(@|qQBW~IKF*`xkYN}jeuip@m30jf1Ap{1Ew9w$z$`&#f|QcOc^ zkIInXLeDcRwG#FWcD&PJ!9vg6suv%-Px(>y+)=44^y}|ZyZR3mw??_>^tX(T+Zbwm z*nfy5IS0vAsq~<~GKfjT)~f zeIvbU?l3QnP6K{-EzLW0gtZ=+y~)H#twXN++nhHZtVpf1Vcf4GmdTT^LM1k8$?d4kYr<b=?hgeVddqa?>s zMD;Jf>xzzhJg|CF?z1JT`ee*dX3?7}p10Vk_vQQzTcnbxQN%n)=5BuaYf8V)NN0r3 z4n5P66DPKOwKhnXJ@L;8l{M`7YXeoAyL(Fq=Dao5_Zf7e>}ye#Oyb*sx$!F}#mp#B z>GEh^{NZ%@fGzeJM{cP-I-N4@Yjx%DfxpV8QW2imzS%kUX6eN%8;4?YGwYjsqv=bf z|A|94*C$jC_boVe_=Mr3PczrPei>RBdt&Cm7tS7bBPW>X_EdV8(0+H`j@-y_sX*D7 z`WH>TS5KKTg_gJK>*c&@+8!v|qhK#dpEE4MC)g+?C`h^XMn;YkIcUR%1-zKH*#>p`KB0JWWgU&nJSMV`GSRffG%- zr~Qh0)7MvxR$#@V<_&i5^MYOB>LDLKeofvyb?6lT;F#6@#DiQzBv50 z=+?Ds5LMrUGix)ZK=$IC0d%P~EYq-{+B=+3k}V%gIcJ&{|H@B$soJVXmBukE*Lj>j zl00gyO((y$Gjvs5@%Vm%Y=82k4dNqx z{g1mh#zsN*2&hF~{t>RLDYrbg$Zt9P=kBM!R_?|Jdw4Dyqr{C5$~F$T;qD=))TdH! zGXHL&pf@y5zrC$p`lC!iBaI#V#B7o=o`IBO9Va(Ov`R`!QcYUfZhq;NUQzMq);VKK zwn=Y=9V691w>+n%|1W(5gK_7Nl?P_)&sI3B+bhOb@tx`S6stPG{KAT5@_V z1ocNQYGR@twQ$NCn_fVx@DhpTrecoMvb~y)>qO8L@S)GD`SG7A)6w*ic5^%`IhYT+ zRp5}48CFCuE+}1O2hstawhmbP>S;3=$1rnbiTE5z#o)Gz&_{ytpi#1zWdvK#NRA;; zjs$&qf{jXi#n-|ZY{Dj##MhHqJ;UGznP4y zo!p32MGE2`Y{2zK;1UlJD1tUN4cYrb4UN+QO``I^H7_a}bgfAChoUp4ByL$((Clo6 zA{CJ?XocI&rcUJ7?g=Qs@fi{jMO3Vz3|c^I+eFupdF&)h%_?PL$u)Qn32?ec$REPa);ycn4K+m)BHs)V=gmWsZ!-XX ze;o!I@x=H-*Tg7J0SvQ)%IjPa6I7-*eh2{I(uy^JTuP%&`S`MtrTF;C@`}{dpFe-v z12GGVL8Si#W^j_Oq-f?Ap}yHKo;gXgsa1FM!b{X+f7=LLadn)T~UB_pG^i{qC8R|!CjJMM>0(_Q>W}r!tzc@UkQ7Cn+my@t0GpJ)J%w}a@Uat`t)%v#9Ns@-iTilO z%x$|!7ytF02r#-05w|Op?_!2hSR^>goNyi8Ms$g->fXKQB1znCDFG+~I}uvU-?Fl` zwQcf2VN9)zu2huIE$e*!pC5E~ZdsS_M?9Ftrj3N=NZ=pcb}4#uzB^=}PQI+fu_xq9 z_#+W#2;w35k7<_IB0daI@%e)~uk0o^7!4~m%X_=fDIygrgIKk_#Czr{T>j+9GQ;6M zEUe=~`zae=92X8`pv!9rhPZ?T=nq{}WlCAFivhb29XzO9`d9*POk!$Ff6XU}iLJWR zhi)_=HCF;j$Ca~NZ0&tRxftr@@n|Rnkc*tc!eHjOaow;y>UjuqPN7X19xjBZ5M|-t zn$CbzNr>1o9(p}5cbLzm)gB^9ndGY)o?I_lRW^cjt|v5n9#W{lT0j?JTNBk9T3cSC zuIPZfNs!t>vejcDh$Faqf!JHJL(Z67-T;!}nv~QB@?1)3Q$G>!B=SlS^orUZI5qZ# z5|n`eTglh}ofI*xt}0q1$BuPjxxd&wta)n-v96mPCu|17YxRq4hKf6+A&Z#1-`{ut zPDGp|66Z`!C(FG>;w-X;L{PqPq#(&5pdsw~Yc`};arRL~UjR46>^Lz4v>H!1dc6C@ zbbaVoO*w&Dw+hf5!L68aNdyDPsQ62G&86|>7zTQSS$hj-2fqUM#8Vos!gD~hqzegO zw9=M>=716^wY?t?-2sNg>9Pi*wo9H`^LzW3+sTs`yfY4E`^XEkPURafv4RQJ)$`a1 zX}kjtjhTE?Rinf1iGRR!c%(y6?bF`oi07B?1yjDHtWO(G5Mjp>L7T2?!-HgJ%ot>}7>;%0+03r@z&1UJ&g)QlB*s(Nj?H z$o~7k&HTSVr+v<}E0l6sh=>d9{#;t=L8dhgG4_ZS_qZgmfw#S}G z?DyO?Yc5Q@F3Gjd@71GUzYpg|R&-YDuujO)zJ5LFD`vSD_6*hu<2PJl5{+`hv|*ZO zl5Eu0k8U0}|FEpEFzbfHy43Yie^6`*&ox4+A?=bNwW>Kp7=imFHAiRfrN-i#{{y)F zPmL3n)LId|kQbxEN%v6*79$vX9{lA@j?k%uEH^|rb5GxIRV&zKU_?Cwxud>f#U8zI zB8yLOs2bh4wN0{bUkyFI#Vpu#J8cDN5PD&;WS6tD8Up7^yb%){y>-^3bcb~XzE;xn zr2rD}ctu72g<9l@v#}KtUb5vz3@6ROPy5PG(U^kipsIgDwvL$JV5yJ+>cI^0wU?2&G9{H+1@RneZ2e;RrRYpnN!$*X*9L0}TK-1nm(nu@5`^&OBH%m@z;whb$O& zz9ScC^!oG}qM}PAc zZ4413)w~(9$+WIz=qv~H%{PYw<7PgTm z3876vMVhjz6wg#I_f4&Z$l5=w+Wf-ilxFQY?HXcEmp`-L847bL@|;nFH&OM7403K7HcDX-A>w6jWNvPZA0gYL?yPZGCthKs-^f2G zcO>fCeE{@$V^uho76cGy?IULtik&#qBz`OygRzCg0~%*FzBkW9q|I=bX{`r5Sb@L+ z`Lye?ZIt|6tE&UT4XVf4Z}08|8h{Sg3fZWqC!|xtOU3!+|Ga!E#ZaK>$K+s!>_C>a z75O7w`j_@=WV}WoGA1~+&hduJot)wVK8r|BAUY(lGHhJDqhZ}kS7sibB%#ISP!u8fJUkK! zIFT~}O%j!65M4w&ATFL{ZSZOE?8{cKKITcWu91_A>m4)ZIDh}5Tt`6!3?96P_h$5* z&MzJJKx1)i24M3+K|qe{Dsw3|TEP$Ej^ww1#NnzRJm+}#LVxQAtraDxiNpu+EkyBx zD+f85YsQQjGt3L(lu-$=@$wq-KEQzR;jGSu;W|hZ#i(QuO7wNqc}XcL)?)_s>j&{l zSgaIMvidgN_!3?B#Kuk|RE@;E(Y4bV1V?`)25a)YSny0k4*lj?-B_$CW@+#-Y`7>_ zR9arZ3Bx@FGa){$SC1ZZEG;bqKewtYI7c-}j?A`lF|YEAPH2>q??9{%CMirxo#d3oRDmwm9Yvm43O)IGdCi3dkR zH)0s0Ii~KxnDCw(?c_NqO?nKaWSDV zrHlRi3?&0HSDI&qEDoe2eyE-S<3Z-(A%8h?L=vCr+isq|)5|xM-4)Tb@b#h^6$;|6 zW4V2@XF^_V+o&-?Yn|eGtaq+Opcg5b*1BF?D!zrlM(s_*c-Rb{q}CPcAgp-LS!fm` zzrV11b#%>0S=qK{lCm!p1q^-3y6lc;8$I-M)Nd9Zn_pcYfh6Cbgl zlOdStIBr_h6?gzNUgt}wI8Nlg;Dnv0-aE0))f+dmt*S16C}3v|U>6XAd2$bMPE5L@ zWz=WRk~UsxrMD%f9Xocc6N?7{Q($_D+JKfV9k=WU#6vd8Tn&^NSm3a}MkILbD6efC z-Jo^3{lICAG(l9yR7By@>(=drMcF>@ML(Cn@u+3XLz?^FeoUr4F$M9| zo;lGg4Fv(VDOZ0vd^}`RB(Yy+>{!K!D0Y$$H1llO93;ea`Z+{LgA<}0U`;N-zJ{)n zVu)^G^w?mzj_kFF9Jhj?q7+{p$xIxv4LiGYK>W36(R+j=d<^@Ecrzz?sCG$H`y(Z#J$D*HQhl>dCJ~OPA7;!8v@r2PlpxhbPECD*P|7u_hy_h~!Krj@n5-&F&%+@fckmYWGuKR<4_r;$wA78=D&euQk7`FBq?t8Kime z&>;jE!h_C`Y$REJenx@Hqs0-&Tg<{Z&Q_dgpviA!^Xq}`6Coe}gM~|t$G1nPyA=a| z;)<2D_5fN~i=FI?x7^4s%EkkCe6Z6yF z-F{S=tt3hyAo3QXZ4R6g1Tw^pV)cV*_>-K-D05N$XZy|@a$st1v$Exh%+Z9?Otv*C z8|CSYSW$IF)=F?XF`}qL*RGZ~rXzdsUY&lp3pZ(;_r(!bR?K#pTG7guTEq3w14Mdj z70*jI9av2Z;o;22yhvXr@79(t=gw>kLI)&#z}yo^0TNe+WXz&FP$vm#et=5;;I<;I z^0@3;8i?E9p8jde{!0ym)`75soSDDrC-~@roDfBt-!j}ax8<;Rw%aB8sKP9rs>XgB zPX38nQp+iBDaG5$tDF8|!4dIuw|DR=^L|PFU#GCca1 zRLSI6n8qL>y&(u7zYfx$!$!Ww7MY}Zp(+d0^frUNj#jNOCnxd>T|VWeGN zswr19*LxOvoImMQSFd(w?T9u_F9;ZiBgW5f5JfinS>mN2_Oj*;<0teFVAE0Y=}NpK8)@Ep{`$_Ud*_;2_Od=c&>9;;~I#{)dd% zcD%1;lf1j@Ov}_y&$B{ITgV+Pthb{mDXE{bVN1`%PFHJ&|>2a@e!{&@GcSS3NXSG!@e{vAnV(y|%}$ z&Yi2)Zui^zD{YK_$%!9_?}STUtW5vhr>D5#Mb;nJy_E?#IPl)UHNV5-eWV|2wH}Wk zwQRfZyCa{gn$Dg~Jhe}8ak$drF-l#_JgyBN;-Px$NzKFbUaZ@;t?hf-Zrq~MB(rF5 z(#IQ(IjYo9Vyt-!5yB4@E^A!1^foZRKS-6$I#uPW?@z~b7owHq!#GBi1N|sA7 z+qh$}=6day=L}OLzB$oLjBc}iU2o-!H@7dJQQKQsQX=E)q`~4!5%3m+0*8NZ6dr5g zJqUhY#YBoMZjgk)4B#TfI54?4NOBNS5W+19>=ABjz|?cTKnXmt2xkIA)>N%q8-ayx2!Xa3l8xLl0g& zZA0q02RxO|_ZbdEl|64qV|j23@f(CYm4_s80jS*d$YZ((QwF}(=B;NlQm_Oe9E#c@ za=-N;CF*I>cQ=@B@X3AOq)0_<;Phst)6m!+7P{ICPCSOy*nw4Ff}@SvtM*Eb4x_Dq z=UPOwF{z%XWEAe$`xB14d3x%NIw|IyHz%bswe~AB6}sJ@ut`hZS!d&{b)%CnFT$ry zm9uq>(Eyjyd%I%U-ocOf6N&p4(HzEMpBpF*Y~7jtR+#nf?CjDthNFCZUJnD2R0?yu zlofUF!ickaS67AGRN0ozwlp7>9T7_ZD=~0a{aP`9UNwd@d$D~VQ->WpaPD|6Zn0p2 z!Dx6L8IfSa*xh|>b41Jl`hPi|(zQc}wEzozj~jZMeXRGAK7w&ObepRCp+kvMxpTy7 z$*{j=G{q@7SxPx@qQ6!3#@C-@fMlhZ14tOK_-Wy`CT-#>+eh0HSkC?Y1~w!N^DkmP zi6J=@dm?Q>5K8O{tlFCz-MWflg2FEh!zTU|6Kpl}+t-ZmC;d9TBZKLN(UC9po9QF; zKf56bq7`p~lzs6&0M_3#Yk8U2Gde%@Z^vpD?C zXM33>`HQN1Y8)g4aVb)ip}|tvCtCDV+O%?iHR<2e2dLPrK|v1woEx)AxI@@i=>CN6 zQ%pz{4D#Y}hY)>}&k;yd2EkknjqnwE#y4kkj)%c^DUmnJE+yW1Le;LmC}FSeA;y}( z35z!#F}Y)WSyu|X+cwH221_zNFJ5@?sA}wi7x7=EP(YoP>fE$tch4mni_>qn`m4?B z0hLLe;vY6N&L5}}?)Ck=y0@_}csTr$OwBzDlAF1eBE$TMW z`rc3(5MgO~MOtRxJ+*_eL6yEz{PNj8NBiubyVcg(L^on@u|}^G+qYLnZ4nocdE2|O zuEI@sd*S=BiQewJpL{)C@TAQYyKXvNJH8K{Jz#Bwg?^}%#WwXYvr7L`&)GBN+a7#Z zTDiC2$-%^%iBXLo)78R)MP-LZ%x31ic88U(e z=f8+f)n?b=Rx8YIZhMp0PtWmA_2PR8EWPK?>35k3Z{8K@VqpA(&#=0O|Q#8mZ|B^ z>bCE-jmzoX3%)FU;^@%Zs|#ux_XkTiUEKR&pQ3*!7deZ`xvH(l2d<78Dt=ppCyKpEQ5Lwb)un-7N`-Vl%Mf~Tt; zJtr0N8Mv|48fHj}I$?vB;gf6C)G9ShL#gIJ*GZ#}vY59FI|>-{#uaa*9hPcOwf&Ku z%Yi67GU=D&p8Mpz&^&<&OT4 z4-+ru3yHmnc2PR_JaI;NytT6`qQ+&E)>~YLBj5yVSeRCm{nO@VnMUT+OR5PS1iJ`g z27oGtC>iZ)ILO$8j8UeLZXy5-^7c!%tr{^1iSYhk5n=V%u-fo2I~4;ZF&;A?a$f>mRe6>?KyWaS^boVGiNF@~KQws>c}`>ZoX0mg5q z)YX|^*35VKXr;Gu<>9pT0md^g+`G41d|ScglPDuSBGP#WI^PyAId>T`XMW@U71<4r zzm(sqy;<(^%00;G*Yvl;Pg)Hn@DkQmNG2pG_+|;mDm@^m$#v$=8rqlip{Z^l?G$o` zWiPAd{g=oV{ISTI0dqq9#|);eh#yp{m*a-T^+WD+P2R@Hs?>=Yq%EgV04zcC0pKfq zgl-OfLRSah+{TkDtv`rFXSQWbxrh@z50y>4e-FV)a}=TDSH$>B@>-D`oPEJVbX91@ zpc2F;t*dX4g&QFh3$*oEF>at+5?k=X~Da_XJYdltfi+< zKjacrxf;Hp7&%OQ#Bp@sLVfZFcNP|AJG<`|-*W_qj>~u+h7B^P9&J+6WLh%`x#8xMXL=j9oTn2JMyKHmd5fN3v8xEq59)@cVOfU)b&y5&*F4TOQ+))j4 zKfyNx%?Id&g>4qHjt8WM0q3x_M#Ov!U0m{u_0NdmL3{{LohgCy-HL_*lZr4DTs1W0 z#7jsL!XI+|%lFUuy5>J1{O;rx0S!;#7AB;nbs-)7TVrUqOHO2^3NI6Q8!&+)wJMX` z#Iz_8k4`}*erIf@iZgBlN_ef1aOM@8U<4LZjz#P`O@Ww%Av8hMPv@|u^WaUmDX8$7 z@GzIvV2@M)J4q8NDAI2Rkkf|KR-}Uw@wg<~)QR_T&(GXO%4=7gGvK=-iBv?zW9CA| z2F^=3j!%k0?3FA#sWp7G2tOnqQ!k@KpY-C`tQ9$%Te&3sdL0fEFJ>b?F@8^+$OY;Y zZP#*fODMVhb;6_watHs_c8$Dp<%(WDaXmT&$n7B6iQgcmSBj#W33OkP7=iAlGbQl> zh3n>f`xgX;ZvT<+`0-cp+KEhXrhM8sU1_=Y8^u09%!yLjuu~ztyy-ks!-UM>!y8YA zXoMw_!X9dtu?*-~-iIOozPs|@CH#O9_Ay5&2 z0sniXNdpmzstvRsn3RKf$fH60wU|O3sEF&|4ekF5_1+7>Rg~ z)vGJ)KV3^a3&~Rg;F?TVcLlC{G{1#_s`J-T>*`h9BZ*8T4-3ODzvHZ=;f^^+TwJuT z=!8|1&BB{2zD_a`eQsn<;%g$I(K zva@{OsqS9N)eN$gX{?I1putu;XS7Bpt|NlYf(F_>N7;0`y>jSW07 z{pW3_G??-R9Zg!N!3B!ZX`?xvbi+UYm`hVTY-ECko+taw3$Bk6ms~1k$c_af^U>|eF-iHO#g6-ktha5G`5h^DRFUC(#FMI# z!l{jeDHQTr+-dPWxYOGpEOb|~FBo52DOQd6*jI=E!cCzM`r7>iND-Ye;8jmHmuNUgI{QJWb!WtSTkm+#Ad@q>FgY0bN+!$qZj&{b-fchlYh?%S$FuGXi{5#Egr7CX>ILMa*P~(_|in zHz9W8+6C{*+j2sV<5#3Yo+WKTO?g+-?dojJ<)g5|AN9|6+TQ8+e}HUU64by`IOHoG?j%8W#3R1Rsh7iY9KLDVP_iL0I|! z)7e`FG#!3_!;~Nbf|5$fPbH5?2ULP4bk1f&$Cq>*lv37At^ z0Fthn{88@?zE{;}&t8M7h=7Tb6bxZJK$Tql0>hk*evIkjOfq6=FcFeXjg6b*1+?8U z?0Fz60z(m++qbVNg4P2_hzhGN2>>h?Z5|3p34l`J0Wv0VP~!a`g8JrvgDAZM5)2EV zcLki;NuG9A5SH5~Cg_6zzzaSVfUyJNTPE=6qyii}la*UI0KkgI zYgs{v1j_%PmJpCMd;^Ym?w$1d4{Mu1AO-!S15g@`0uTi68j45cK)0;Y1RQX9Nf2dGb5l~2HGG5U>>Ju)R8dgA`vSpDiVP5FDPJi4^)-}K<@Pe0NMDE zDe4>90f_foKq~^k4}v*h)&|fU@EN|HEV>1%eZ`k_z+%_1V17ahpooA-=}l>D>efjQ z$h}|_@m6&LzS7f|_E>=_FO48r%Z?V-JLd;TqwMEN>E(pL9e^Vnupo@>upr(6QdlcE z4G1u2z_+thZP?1x>E!V6KcI^UkO#aYlpK1l9kdxb^Iv9j3kU#fAQsS714tfz=p_Nh zyTszUCO9zhlT$%#g5+fEZATA&4tO;y;%V1YM`wR|9i$u)!1D#P+VP|N0KCixa%Mop zI08vAF<*p_{LvZ>dMH2|H% z!S(PXQ^tNMk%4w-wS7{tB+umW%$9Z9RJbl zznq_&V|mnGz~;Bf0Rkc3DjTe+6>!XF0cgwi6*_EtG$&%kN(T>90xOO-Uje>Xc%Q2zGrxkqatsLJ!l35|NFRHfhb5)k(V1Y)n3Z`D z{uda3>CXW@*mT7Yw4|(nZV5ykd?yVcE%+1|G^oMG0E7pyxL$)0gwOo| zdBJsm@eu(KuM7aIGCbKF5U&|`(Z%IGrq4HGK}HE2E=cYG_vtu!zyJiG%PnB)GG*$` z3UKUS-WkB$!1%0?3BaXcfZ7X`=LC2r7_iK=cEpZ*+T%x}0>;6|w%1@egPlLID5DLG zVF)1mz`9V!VOT3*2a0d{fN}yz!KeuU#i|I9QUR?Be}sUX7%35umPU~WeB3xZdv z+IS!|v-SYV1rS$UcXvRM045eL8BOu<^WO)IEMNg*RHFoT@+k=5pv?skR&Y2y0U5P} zQz;lTSv>?+-U`sR;^P!v*acz$nBr@)b_%Fat^@M`MFbL&MV%T=^=`nbPRDOPuz>+1 z7z~)PpBK;D8ObICt|275@jl=y+DY~|)G>AdhH8ue9$Y;=X}0RU3En7vc(74114smc zx&w4zqP?bG;TwZeKKtLZZ7l$y1+a>+kplnmOs5429+70VZ@_pp6+yQ!D?R-Ouy6oj zC~*>WaAZIt`S>Lr&_Lihv|4mIeFwUkN9LtwP58wD@?VhGkAS&!_r$1Jd^c{1igaxLgCxV@qH)2Y7xWp4;QRv^<*Td7J>S{SPps0yiPW z8G3$x{v|$M2YH?j^n>76U>$V;SQ;RlobvL`Fo0^SH*G_Cf!!|1+d4t5HVhmGLE4QU zUkkoQFe2LkzwH3Q6HHD3(*P{RQ}HPj$dX*P=fiZU*kqHb{9Jt0Im$US(Mnx;7Lt@jHklr36@YD$O!?XXQG;McYYXT zsXU+t#?K0U=>@(I{CqahS5_&U7zF_f0I9)XxxMqp`#<;tnmT^mHXwIoP1u9f$rGO! zu>(_K;Bkj1?uG!67*xbmFfx2q13J?D_yQP!&tPa)r*P3bdt)#cz|7VR8()T*m*+KC^74f1T@Jd_90M!;j%z1?*iR3><* z47}SHp!^o0re$^2yO9M$C=(;*DkF6eO<0s(0Z{xYpfnBL08x3)Z>Jcj5y$|w4NR^y zE~qI4v>{M-0??fDp(9*E?C>+u(nFV~69%w`vcPj24ZPPu4vm*fT)=Ty_*uzkfEohQ z5Z?P7*y$IT5eDdRmU7c1rGe^5^fD26?l4LNeF?B#SGBX-GL$gZiO z^81lf{l9~O{{J{d{NF>YIdXY9YphqE^PGAGr76XhU9=4QDY)Q}ml8voMys>m4fyh& zHc?d{R%VPT76<2hx7zS%LKwzjw@24Q2Td|il=+?$d8`Hmdhv3_-DBTJ+Jn8@>>p@C zu00f>Iboab>zfL=IbPzrC|CA1@5JZkL+~)5>~`N+Zb(;gSS59Dm4|z-`^1<_ z!p%#Pw{jZKQ;CecB~LjF)HIAszEvu*2iHw!Od{O=`cB58gp(us#@L9{8ClLr20pCW z#e@toUx!}HC4v}DsXT)E!R~%X2e)Si^R&o1iEIWGYRVi+F&*vNnX-{Gwv3Ik5i#O! zf5i|*)+HuIToU#5jY%tzlw8ta?|ussRth zm@4|lI75uJsO;cD9KU4|gsv1}n=U^dWH&})+Qdkr11Z7|D>cxe##cN1$#S+(mC@*6 z$lJBb>*!z=?hb$I9J@6;bcl+_M=YC~h9-tkO}l?=k1&Qo>?i;GFY%~Kly|5tQwM*@ za>8L{L#rsuGQ(px{{E^4ipD?SU7+sL-A^ioaQRffukF-IdzIlu=A*1QcavM=fjQc1 z-(EKWR-XBt`-dz-eBa(w2{x=n=c4H#!`3+aD$~oKhc1I#lbLM6Y3Wo@%coHmp||g> z?^`Fn(z;Q(2AjJkk67#w)N=KMm1?;b$s!o`?WnoFK6;cUS9~&vI&!;kiDfs=@S;8S zD&jzR_r&mMHr()+(baJ9ynE^ya=I1^t&~NO?(a~N^W71wmqqyP?`TW$FZ=ByiO8Xf z3vq{)JFP8z_ez51#=btkAa>U@FR8CgjD>)&_0Z_*CaG%S?i8S3I<&UP+$#y23th9* z4~53`+3}Z#1+m4}lDbnT(>XYt)>1T+OhMYg{^Xq{bKZm`&x=qc)e8)j^ z-mV}Ov7s8nKr=oYXeOibKc+74J)W1REcGOzD4aHFFywd#G8#tm&dc`t)1TPxm?7q} z8K{Z$OF$2h+KdxsoPmh_r=%Kp4e#XC@l@Fwi9p-g;>NT|!dt+*;;7BkdG58xk`f6; z%)8=Qqj+z%zqPY@)K*B0%jtw_8e>nw+I088pDxK_{7XGH`95xhNfT-kkWG=m-Yqk-N^CnY8At{J-3FJ21=t> z%yJ4^(}Bmdmq!`qa4p?J4@EXeL_Tos4m0DaBkx_QDiun*$3t!(M%nUUs-b<-aIU=h5V7+Z5aL3<+s+)$SC)+b@^&mL@!UOZ|M zG4gO-N$<3Whz@X3OBK`4M3evNF(SDI54II_b@I?NWSejJbgRaz=n!{O7I3XC?$NNb~0(XKGSZHu!%a z^HYa^%?;Zu4AN#}e_e>unck+hc+jI^iJ*3ofSq$)-?Q4ohTaA?D)Zhr^wp*?^WlV= zuVO|ScH}C)?v7Vep_o5$UOpS0 z>Zsk^(6TH3L+jJeqobCSsLdCf@=8k&4b7CVK?Tx=3u#HU(lT`{*{pM(?i&1#_0FvS z+5^4JKTa96U)vvQIX$2F^Z;XJ6Xkn>?dM8FVLT+Nm*Q{L$Pkr%9@ZRY-$i7KaK;L5 zydYRy*icyCpw7$|;>tFgRea_7MiZs`Ld%QtFi^SI=-TP`!zRi^`TPaLU4teX2|@Gf z(#s!i+v7cSsYhl%Cz2iYo>xIjPwfQ^3l18OJN3*=nN;mw%J<6`UXsM7_(x8fV#Xe1 z-7R5TpyHl2ayqB?mhTK_KH|lC932*TH&gK=A8W_P55YcA0R=D2>-_u;0^&M+jAkwl z+=wVBO1K!H^NVS`0bgXGGOEc%W?B3$-z?_YJT6HbJ@OdcoI|=_y37c7x5P=v`E+@P zcg<2aNL>CoP?8yz&eTDeVD2sQS9b#aGSiOlJ;<#v+8O)hq0sGX zJL%nUKux}~!szTl*-$WkySlgtcGPG&n572Akcej^^NkH~N8wdpyXu7P2 zlceDMWFl1_izCDDPnin=UpJf`EphI#dlf6X8T;6uhVaUq8SD-D|H|EB| zUCbaK8J!WW3jHlai^ESTl7&lXMY}w~8nTrn`VilJ{QyO4>5HoW+UREvz3ymi>Lh17 zKNHFh_x%r%E;6U3`I6?b({83k6Z<&JR4V z@h;w22m#+fuGx)OTZ}Vc@k<8Yny5@?Y!XY1$zblDBPTxd+q)+ZITHvxa}B#2;~4?B zyc{nKu16y(G;I!t68L=G{B4`%ts4>(84lW+V}udsSJ&sp^32*!7NYu-Jv7;KO&QxR zxJo(sm$+y30=iX(W7;jmMOG%G?>#|YdEE_rI?&u8f&Z|{#+*3?@8-aq4CldyM=l>3 zqNTs$TEbNh!F7*d#GxQ)A=SFQE|%s8Ag)YfB{7SsQ*6t{-CbqgE2X;IX0z3x$>MMPw=OSF zX#GQtXeOHvbySajk6m?KxTXmw=vGLNFit#y`m6}c2OL~qNO7kZMeYvGYDV7oLzBw; zIkWuU+wH}1UU%DV*Fh@3K^s42OM}oXQrM(`T!K zc3z$!Cnne@f7`{Upe*7xIpyPr(KkdDc7=(G;!vhsdjuoai>-VvpeJCHjRWY zl&_@OwLagmy`nZb%$?E_!jlMF$gOk04!`%_RE3Y!EU#}Vjf1^b(x-`3S3+(NF}HLc z3_uFcATzcs3ulZ3TjVNsvraTefl_@ze8|PA7&D?>!XdCuvXziG8ZR9lpkF{UJ1H{O zJKAu895Y1>HqeIDC5abSJM8c>%fZLF(Aww}`0nay8>^$?0TlrS+%IG=v~(SzaI@~D z9CvV1NbA5V@4IvaO+G=ibg*A0K?89&gQygsPqZEH{cfJ^9B{e3Zv(gSDl&Wq?|0@r z>A2xOdXrG{0%`tk3o2EzXO?)ltFSJ9_*?tTYr(4e@_>r3C8b*oEl1so6%5p9U<+mK z?|SN#V~M<>yY1PZT`GJL_UX83*TxJdMygNk0xsM$nFtqIL%@?UmUPmL63tk+QnaVL z=$E>~JzF2A-ZnpEX^;*7r_J#s;#maapW_auYaSw-(wm=+YD5(^lyAl~U((Xr20jJ% z$6-GU?e1TK;#ilL_vIpI#{*`Y;8J`k}kge2-cvV-*_>2T{#9a;O3YbMJk^eAV}Ob*R|8q zCG>j0M}tk_l_j%1jG+pFDIxBnX@EuqG$4(_)pFJsqpJv5WXjU7H--I}*eXm|qn(b_ z51b}z^~iKwttT^c-1k0sH&bxnXmBoEqwbsCXM4rajzys|UVjhK?LbXg;%UGmD3jO? zH|XP|xO;F+z8E2e77g5HZmgI5EPvO;sG}9fltD8b*IPxv$n1nDFJH z;uSUF)ly|u9LZ=)SXKaN^BZvvBMq>`0fG(mL4ir|KGXyS^DBCgOU2fMGjk7G*2e&_qAdk4wKzt!T2!@W6)F66t>v{Boy+m`M_Ky}IJeorfYi+(Z3YJKxI(3~Q+w(c5s| z1a^YX%{3$bAwP0TCPgWTqE}cJE zp`*5|QM!kop6KOI5`p)5IKN~rq<3W>eWh7wR!Lk#VX@5QBapiDg{>1<^Q=Cu7346g zua71-=Vfcx;_6sH20KTIVb)eM_RLa3F1@X+2eT7vPUqED#_3n~u!8I=ugyCvMrgWV{dttpjk zaQ5AO88J5SwP3`tLnpN66?rv#k83#eZ&p>EvxyVnXBZc9$qAGG9%-#Y4=?`E|Ap)% zzwXj~lzFMH6(Rn%QreHQE-dmVu6}w4_BD^fX+8yf4g`O5cL=)61At7c_QDIJ^?d4) zCAr;9bC>_GSq3dkGg4&H-Qq4Hc%Y5dp>BDIi#7O#$+&oZ8p@$soC+(Dq4tuFp$U6$ zY5_;IK**tc=se}Y4HiLS_a)M{B=hv91Jox~jybTPnvE3_(=jnmQKhUD4o0WW*Ri*~ zaUy&>Ye{3swc_B|{*jrB@Nc6hqI{hfpB zSMj~c`sWH2I<&W6A-k6M*6?@CEC+wTDHrWAyxRbY^IN_eGl(HigasOkF-Jw#y4{qS z0s{Ea`RYTNFu3H6h@8XCAfxQgF|MGH!-cenukoB1>5UK1I#m~E4k`6swSI~Cbt?3E zki9ZvQSZH4A{o=m$g}+M4DJl2mmf3;YO2SNdEa+rW1c;a#8(0Yo6s|#OB2b=w8|$$ zkMC~lre35yRBS^gl%q5PR0v}OV7*U@M_%(I#fJx9a0os8j1*8YB`65MT7deC zC0UYrgEWk1VDR(cbR1e3)Nh~_frA#K`Hu4YvTZ2$TyrfIwd?t!P!iH^(*zK@wLw~naf?_Hu|ba z(L>Haod0#}`yZY-8FzwZSDB>W?HeUxCuf!pyML&$s}K5|6k(ib z6g6m{BP2-MX|tAIfO9fWo#^|{hb$@&0O`Lhc2Di{!i})M#pi=wI>xR2XUZvwcwt3R zY995hUSN0gV2hCwR?{RKo5! z2}qGXMZmh|#};fiG9!3;H0}!6%S_4bTQv1MZh9ZQ0#~GHjdl3Nj$(4{bV@vwb@O2) z^S)4R>F=KSR;rexTs-;eeAcEQAo-%jT32_ya3ZJLvb4E7xz696iz^!SHbM$su<^Nbf{MF? zKWt$*v+XmltJ9UG;hA>YPLeRJRvD4nvX5K%=B+TP%1`sc#w^W_*uCc zmoh;_?=xp*ks9@Y_}NUq)NF{v!2v~$Fi5sYs`9a@quol9Ml7Nw<7?oltY4GNFtp-E z@xq6vF6y2SrffT+E)JI{y^2hqftdS{=ROlS3%Hc$=UkrFMQ6gjFxoM zfc%5ME~WR~uISBtUzw?&NU%^3Q+-!$?#cN5x?S(WcShfguBHR|SyzkkNeK-uCk}R|&39l8y_xBHMfwFpL|7d3Zkq#>|h~}_DL(d+U04>WJ)q^U9jA%tRB*CSM7JXfNU!Zii z6gM1jc@>H?Z-nlBpKjD5at{CAuuW<4!a8Sn{*;fpslIHKm479}Cp6swT7*u2>?c7D zPKsy{96B8z#>QuKa0xE7_0p=?o0bNYF1_{iyEJ*o{<|QOHvDo8-oh|-(eJ#=dQrE} zTA`8AY9Vrngmt1eit=CiA1)(yFC2tF4~Es4)9@z#>N-bW9I2>XJL=JhvK^}!-jteK z@X$#}0=u@&>LCr(N1_~qbG!I;bWHIxVED&H-COwp<+)c*&0r16p7wcHBE={Laj!G{ zZKaB(XS%C3*nf3FLas}WPdtA~ewqU)y zjku{mtNz1MAJ9?&T?(beS;zj5WxI+Hf>J~?F$Jo$j&0(IsHg1rxJhS_(! z&n6m5A1~%0db$l^^1>4PpUxEzH2x;bt6}q0Yq;M%?q}HjAS^TI7u*&dl zgXUa>32pj9BAZfa?$gRy{*?W zk!!GecRJOWExkXz60EwRg$#RCVTb{MtG)q zO6Z**qspBlv|#4`*#Knw!Gb-J6r<^Dq81m!F=B;4~jN8N(oUkI?Ug8%>*MG5&(f4$R1PL~>WQS=JfjRaN= z+tel)^4oxx%XH0|_qmyumnKI^|K%Xxrs#Gq=Zy}6M%-=`i$WQ3Vdnt6CGfMw@6igS zQV+f6EN-w*Cr4JehoZi+LPma|uU;BeF8b@QWmUM0A*YM<&eIMf*+zsISK|Zd3kjdD zh4CK0+216w|8$wou{Ql^eQq{sy}048LkHDHgEV6T6fpNg@=90EKM5|;GHs7noJThU z>rvmS0_%sl{ateSK7=Lgq~(KJAMtbey1%zx{6;DzmpaOG=;JGTV%em*@Gw9`I#Dxg+LzxRM7PjdWhrT2 zs{UaTx9KZckqK$(v^}Slp%J@R-r&IjNu~A2Ww&?C_9!K}V(rA4-km^*EAW3V;Qp!b z$GuJ-Lm95vmpgZG+{uUO{|~sK#9%Ux_UR7dX zx%j(4k?rPY|I#RL{rdNjP>bNz7R3$1HsUt1)~(Ke7>Y^x%tjlx_+MWjm^}8mdAy(@ zICBN%A%t$ak$SdypY ziAge-qI6xeW3UC%g<^+i#@9Y@^^J9fdZ*qV4GjLXvSzo^+Q6T7dgWT*7%Y-Fv)Xl8 zpIcHd!>bTGc|_a4D|6%fAphbRo5ls{m9=(9Cuh>k>nG0|$o-`!%jS?;G&;U@r)wzH zNrGY*61axg&*Gqq&BIFO)*8`!ML~^+m3k6E=C+tns-tKCs<~w5>pH>IdSpy8yjV{? ztB~+HB~;}{hqji~fJwi-HlxuJLfl?njw#ip+#Nfy)r7pNMpB}BrP13xQd${aVkE~w zKdWMCbu+x^Nsf!;`Oh?aqAT-0n3D%L*+0WjRG^dcqCT`POyuPhg%%yINZ}DVVxAoi z2Nz!$)75QbB^YTBOee!jisVFw->EVnxf-@6{&;e)uRr~QS;Tv0%*ceajoAL#EJ+IP zYhF|Zt|wpINz`iZfhIF~Tj(86QLBVJF?Mo}&^ssWJ<~5U#EBl0Ds40LOq*qhvpfz{ zgfTo5)TCg&J_sJ_J%j6Ih*N%}s=}pLSFKmtC?U3P%_7!<=-vgQzKL$Mwkj^Ddq1-WfzA+ zUY%}XUebrP=&L#)>(eczuW=dGjrC!bp(v#Ebju2VY499ztU+@c)Endb zA9O61MaR-e0wcwVEW=)qppLW)ckG|ZXkXsZ-`%Lxo6^tx%I>594Z$|foRebC!~%VN zjkqwr)v!vYkGLk;;=7g2y@A&iUS_P1jRXn^eyqwoY6~oJ@i?;U*ZrwmW0HnFCr0gP zq#Ex|<##<`^{7z>-UNyFX-5b|I{G1kby=TG1u38tz7;e+uMKhwmB ziRTOYRF)y*JvyXZTK=Jct|A*vSo}O5nq`*%5#;|L%)I!&XEOZ1#%BEQOHh;n4#<%y z-jWc^k^|y|axxL14c%xEzy~54Dhu&c>$m@u+v-XGpTju*_f`LoSsFQVaC-2`L7T>u)-wguh16@F*0p^uYGM?nNg6oT<2;GhX>|~sD}Cxo7(;o@)2s~;$C8%S02AC=xy;Q42xb#(+it%{EFwE;?}2^AvbM z_^6Ty=4lsB0M69%_V#Dsj|H6i0GSp@9798H#mFI7s&JO%76R_PondGN!ED~%tjghR z4Ze-hbB1di9frX01b-nG7XRKW!g*uBi-?SDWqo~p^T#jhn$66882X02P8_WRmjK;u zof`{~g?2HNL|&qs9h4T>uw>xn!-=0;Tk+T}g<2;ne^{0yaV7|vyJ00Ta9`O;;ExOT zRoS<+_!b>^dT`)GW^n_hsL7$6aGuUTzrx8v{VoqA88>grh%1lw!xEo8Y%7m%zl8Qx zj%{GKZDNuJB~#W}U0&8MWxJIWKdWWjKlCW7KANRcRj`KWW4i1(A&R?QwsL-Lx$Za0`(IS=Fv8qzlYQ+~O*X%}jJ+Zy)f ze;@yEl`Jo3>pY54jNNE5JH`)p`S|>m+9&b}Mj2o9YuH(d+RDp<)@~|mMGw048@iu8 zoX_Mo!qh`?Jc|M~xJ(WF`jQOKa#y?6AblImKEH8{Wdk+@VYNhc@p&)biv5)(2=gS? z=X=8VIKV8Few1p@m|Sq9wZBg24Hbzu|L_>SKqm2x_Mt{IVzyv2blTbZ#&gR`?0@&* zP~6G~>&Vj;A+F~y{Dms%T__!U<7A2Ti{u~28L~}5^-NCwR!dRtMrK)Me;!uW&8+K` z_D-%PB!acE>nz1^wQ^B%IuS@fF`fR$yP^%rg?)nM>Qb>%W7U~ThgSaqcdoJ^AFEu@ z*|%LNb7RS_C9$C@i7#89bt$GpcF&%%$DHSiYztpp@`VVPk+Q$udbNZcZEb5K9Gb+w zTrR+Ik*KX0*49xwN$4+D!OwfAYP>@Um$rx;e++CEI6beePXsRI2i1m%u)!IIhX(%h zN6sW!;`@CG<sF35!y3`z!FQ9`X80;bH0^eDDfjEl7S_eVpuv#!WgiN<@2tu$t#(Op-m)H z17uBPe`#&j+fCqoYdf-wuq%JpIJF#>HrdNAUJ51YnZx_dgV}0=%dbujhxB|vy<>E# z-ILq&;Wrp`J=HhB$Qn=vT~n5&CT1g*PWC4q=In^KZL?eduS-`Gco>^c2#;x=$c#I)(xJx&&^JP4g!;O2mREA^TY zj-{u%Yug&6f@l)zm06lC+$HP{57_N@@?{Q$lE|jE$+al0-#B%rqswVCZJ8$ibdCSK zt*efv<<JEu#2zlXda6D9|c8w3RcyuNtl=!EqpJPR9 zqT2jB@Hqfhp>YX!-)T{`Uo9 zGLrC7My2bNsE4MA+ZF4dSCY?mtO$`*&Yh>?gap$B-o@V(;*V6h#ShW>0+H8F)(;uv z{n=AHE8d$p^O;wxY7+)ZZ{8$obLO@#K;2Q^2o5Oj z;jY`7ETmLp`$f*W<1?-2I_V<}(m;BAJV%jrydeMNJ&m zNq7cgzC@h>}*hd~GgJ zTi8Ul9>evz)#@W=Y+>isQi=KZH5%^TYU<#vIfRpmKl5oNL28cute_U&fTcrfxj-l0 zwsQQm4tV)D@7`ova1U9vxT{agB2!VKK(RZD-0+xN~L2KMG~XW{{Zi z@7)MFb+BRW;!a%Jeg92TO}k4RB6}vy8DFU_`eP53kjNJM^^;?F$iB!Mu_u%t zXrcOM&GYmqv(y~)qwyG2Mr^~^3}2Zps4cbR!j28nF2ye&wZ_LugQ={@xxJh*B{1r*VyhU+x$`HRo|WHt8a+QTy`Qz*^Jc0-Z4{QrLd4#1_nIS%_9!t9frC zFaM=Y9m;y2H!s1#=zR2#>F`b**C&2%OLH%BS_yWp_Sas1ko2K2x$osfj|gctDRS(% zduLpW*d9?T9tvO(Q#H7&a(h8T5^X(+m6mx31Dkv@b(vr`#UgPBTG#!F!_yK)L6eBUM8}KXW=N=Um`W|L_qCeS#QsqC`%r8x0 zIMB7&-#N6qN3TmD>?Nn{yEsBUIVYSW22yrFkNG=tibTk1!c84qjCXGvNYRtZTd-?T zY+a9V#tMFvszNYw>jD{8)>yA-8c4dtflLEfUmlr8QRo3RcO`BWe|FXQWviAhk9`mY1zj$jtBl0R(pedhfKLm@;=?P1dQUGNk1vew@4ryOn@NeyWs;7{%O76hc0a4T$IUDD z6q}h_q$Gw+vA+kn{=AuVy z*08?f?#>LGGZ-c5|MJ!FN%fSdPAZXhqNPV`ylo`5tG%KbN)TA9{sS85vRMz!D^B z{D~O8zb$8YfaDL?AAS~8{H1FKU zKlzd?O1T{t5U$$GuUM>IfFA?}Jb-$frvH00TkoU~BR(fLS>69$K_&vEF^;fG^6U|A zZ=rv85%P27EvR}LYh9)6&OUtq!`1^DV9{)HeL!0X>Kc)Od-%GK;xq6j1v2>|B=n#k z6%cey>qqfbE8soa;Elu&CkK*4W$PM^B?_NC4^>0q5B8v_&GG*(| zzubu{@NrQF{t6U~0zip;m-};wMxIjM*bguPdg$L|NXbMnCm?%7avA7!Pc1j(y9T~N z)o3h{QI9;;Vkj4Vgv@}f4M=RVfF28P6!~8ZAmBciK;DLbzpmeIW`BxoB>GZu^f6M? oM&*SpuB&S{G-)h^DF{c#&a_K)9;=){0RE{y)p%0!_;twt0$sYY?EnA( literal 0 HcmV?d00001 diff --git a/wiki/images/boost-kiosk.png b/wiki/images/boost-kiosk.png new file mode 100644 index 0000000000000000000000000000000000000000..5ca9bf0e913ef5f3807f51c15a2cf58f007083d1 GIT binary patch literal 185299 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 G^8Wz`rnR;J literal 0 HcmV?d00001 diff --git a/wiki/index.md b/wiki/index.md index 0fd869a2..acf4cc9f 100644 --- a/wiki/index.md +++ b/wiki/index.md @@ -97,6 +97,7 @@ Welcome to the TaskMate documentation. TaskMate is a Home Assistant integration | [Recaps](Recaps.md) | A "Wrapped"-style story of each child's week, month or year | | [Virtual Pets](Virtual-Pets.md) | A pet that hatches and grows as the child does chores | | [Weekly Goals](Weekly-Goals.md) | Children set their own weekly points goal and earn a bonus for reaching it | +| [Boost Windows](Boost-Windows.md) | Timed multipliers on chosen chores, started on the spot, on a schedule or from an automation | | [Personal Bests](Personal-Bests.md) | Each child's own records — longest streak, best day, best week, biggest award — celebrated when beaten | ## Notifications & Admin From 203673fb857074db2100f3cc0409c645c34e0e6b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 19 Oct 2026 20:43:34 +0000 Subject: [PATCH 2/2] style: pre-commit.ci autofixes --- tests/test_boosts.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_boosts.py b/tests/test_boosts.py index e9314ae6..2f68703d 100644 --- a/tests/test_boosts.py +++ b/tests/test_boosts.py @@ -398,7 +398,9 @@ def test_skipping_todays_recurring_boost_before_it_starts(): def test_a_rule_saved_part_way_through_its_window_starts_for_the_rest_of_it(): coord, storage, mod, kid, chore, _other, _leo = _setup() with _clock(mod, dt.datetime(2024, 3, 23, 9, 40, tzinfo=dt.UTC)): - run(coord.async_save_boost_rule({"name": "Sat", "days": [5], "start": "09:00", "end": "11:00", "multiplier": 2})) + run( + coord.async_save_boost_rule({"name": "Sat", "days": [5], "start": "09:00", "end": "11:00", "multiplier": 2}) + ) assert run(coord.async_check_boosts()) >= 1 (b,) = coord.boosts_state() assert not b["id"].startswith("rule:") and b["status"] == "active"