New apps Added
This commit is contained in:
@@ -0,0 +1,286 @@
|
||||
"""Predefined maintenance templates for the Maintenance Supporter integration."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass, field
|
||||
|
||||
from .const import DEFAULT_WARNING_DAYS
|
||||
|
||||
|
||||
@dataclass
|
||||
class TaskTemplate:
|
||||
"""A template for a maintenance task."""
|
||||
|
||||
name: str
|
||||
type: str # MaintenanceTypeEnum value
|
||||
schedule_type: str # ScheduleType value
|
||||
interval_days: int | None = None
|
||||
warning_days: int = DEFAULT_WARNING_DAYS
|
||||
notes: str | None = None
|
||||
|
||||
|
||||
@dataclass
|
||||
class ObjectTemplate:
|
||||
"""A template for a maintenance object with pre-configured tasks."""
|
||||
|
||||
id: str
|
||||
name: str
|
||||
category: str
|
||||
tasks: list[TaskTemplate] = field(default_factory=list)
|
||||
|
||||
|
||||
TEMPLATE_CATEGORIES: dict[str, dict[str, str]] = {
|
||||
"vehicle": {
|
||||
"icon": "mdi:car",
|
||||
"name_en": "Vehicle",
|
||||
"name_de": "Fahrzeug",
|
||||
"name_nl": "Voertuig",
|
||||
"name_fr": "Véhicule",
|
||||
"name_it": "Veicolo",
|
||||
"name_es": "Vehículo",
|
||||
"name_ru": "Транспорт",
|
||||
"name_uk": "Транспорт",
|
||||
"name_pt": "Veículo",
|
||||
"name_zh": "机动车",
|
||||
},
|
||||
"home": {
|
||||
"icon": "mdi:home",
|
||||
"name_en": "Home & HVAC",
|
||||
"name_de": "Haustechnik",
|
||||
"name_nl": "Woning & HVAC",
|
||||
"name_fr": "Maison & CVC",
|
||||
"name_it": "Casa & HVAC",
|
||||
"name_es": "Hogar & HVAC",
|
||||
"name_ru": "Дом и климат",
|
||||
"name_uk": "Житло та кліматичні системи",
|
||||
"name_zh": "家",
|
||||
},
|
||||
"pool": {
|
||||
"icon": "mdi:pool",
|
||||
"name_en": "Pool & Garden",
|
||||
"name_de": "Pool & Garten",
|
||||
"name_nl": "Zwembad & Tuin",
|
||||
"name_fr": "Piscine & Jardin",
|
||||
"name_it": "Piscina & Giardino",
|
||||
"name_es": "Piscina & Jardín",
|
||||
"name_ru": "Бассейн и сад",
|
||||
"name_uk": "Басейн та сад",
|
||||
"name_zh": "泳池",
|
||||
},
|
||||
"appliance": {
|
||||
"icon": "mdi:washing-machine",
|
||||
"name_en": "Appliances",
|
||||
"name_de": "Haushaltsgeräte",
|
||||
"name_nl": "Huishoudapparaten",
|
||||
"name_fr": "Appareils ménagers",
|
||||
"name_it": "Elettrodomestici",
|
||||
"name_es": "Electrodomésticos",
|
||||
"name_ru": "Бытовая техника",
|
||||
"name_uk": "Побутова техніка",
|
||||
"name_pt": "Eletrodomésticos",
|
||||
"name_zh": "家用电器",
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
TEMPLATES: list[ObjectTemplate] = [
|
||||
# --- Vehicle ---
|
||||
ObjectTemplate(
|
||||
id="vehicle_car",
|
||||
name="Car",
|
||||
category="vehicle",
|
||||
tasks=[
|
||||
TaskTemplate("Oil Change", "service", "time_based", 365, 30, "Change engine oil and filter."),
|
||||
TaskTemplate("Tire Rotation", "service", "time_based", 180, 14),
|
||||
TaskTemplate("Brake Inspection", "inspection", "time_based", 365, 30),
|
||||
TaskTemplate("Air Filter", "replacement", "time_based", 730, 60),
|
||||
TaskTemplate("Wiper Blades", "replacement", "time_based", 365, 30),
|
||||
],
|
||||
),
|
||||
ObjectTemplate(
|
||||
id="vehicle_ev",
|
||||
name="Electric Car",
|
||||
category="vehicle",
|
||||
tasks=[
|
||||
TaskTemplate("Tire Rotation", "service", "time_based", 180, 14),
|
||||
TaskTemplate("Cabin Air Filter", "replacement", "time_based", 365, 30),
|
||||
TaskTemplate(
|
||||
"Brake Service",
|
||||
"service",
|
||||
"time_based",
|
||||
365,
|
||||
30,
|
||||
"Regenerative braking leaves the discs underused — have them cleaned and exercised.",
|
||||
),
|
||||
TaskTemplate("Brake Fluid", "replacement", "time_based", 730, 60),
|
||||
TaskTemplate("12V Battery Check", "inspection", "time_based", 365, 30),
|
||||
],
|
||||
),
|
||||
ObjectTemplate(
|
||||
id="vehicle_bicycle",
|
||||
name="Bicycle",
|
||||
category="vehicle",
|
||||
tasks=[
|
||||
TaskTemplate("Chain Lubrication", "service", "time_based", 30, 7),
|
||||
TaskTemplate("Tire Pressure Check", "inspection", "time_based", 14, 3),
|
||||
TaskTemplate("Brake Adjustment", "inspection", "time_based", 90, 14),
|
||||
TaskTemplate("Annual Service", "service", "time_based", 365, 30),
|
||||
],
|
||||
),
|
||||
ObjectTemplate(
|
||||
id="vehicle_motorcycle",
|
||||
name="Motorcycle",
|
||||
category="vehicle",
|
||||
tasks=[
|
||||
TaskTemplate("Oil Change", "service", "time_based", 365, 30),
|
||||
TaskTemplate("Chain Maintenance", "service", "time_based", 30, 7),
|
||||
TaskTemplate("Tire Inspection", "inspection", "time_based", 90, 14),
|
||||
TaskTemplate("Brake Fluid", "replacement", "time_based", 730, 60),
|
||||
],
|
||||
),
|
||||
# --- Home & HVAC ---
|
||||
ObjectTemplate(
|
||||
id="home_hvac",
|
||||
name="HVAC System",
|
||||
category="home",
|
||||
tasks=[
|
||||
TaskTemplate("Filter Replacement", "replacement", "time_based", 90, 14),
|
||||
TaskTemplate("Annual Service", "service", "time_based", 365, 30),
|
||||
TaskTemplate("Duct Cleaning", "cleaning", "time_based", 1095, 60),
|
||||
],
|
||||
),
|
||||
ObjectTemplate(
|
||||
id="home_water_heater",
|
||||
name="Water Heater",
|
||||
category="home",
|
||||
tasks=[
|
||||
TaskTemplate("Anode Rod Inspection", "inspection", "time_based", 365, 30),
|
||||
TaskTemplate("Flush Tank", "cleaning", "time_based", 365, 30),
|
||||
TaskTemplate("Pressure Relief Valve Test", "inspection", "time_based", 365, 14),
|
||||
],
|
||||
),
|
||||
ObjectTemplate(
|
||||
id="home_water_softener",
|
||||
name="Water Softener",
|
||||
category="home",
|
||||
tasks=[
|
||||
TaskTemplate("Salt Refill", "service", "time_based", 30, 7),
|
||||
TaskTemplate("Resin Cleaning", "cleaning", "time_based", 180, 14),
|
||||
TaskTemplate("Annual Service", "service", "time_based", 365, 30),
|
||||
],
|
||||
),
|
||||
ObjectTemplate(
|
||||
id="home_heating",
|
||||
name="Heating System",
|
||||
category="home",
|
||||
tasks=[
|
||||
TaskTemplate("Annual Inspection", "inspection", "time_based", 365, 30),
|
||||
TaskTemplate("Bleed Radiators", "service", "time_based", 365, 14),
|
||||
TaskTemplate("Filter Replacement", "replacement", "time_based", 180, 14),
|
||||
],
|
||||
),
|
||||
# --- Pool & Garden ---
|
||||
ObjectTemplate(
|
||||
id="pool_pump",
|
||||
name="Pool Pump",
|
||||
category="pool",
|
||||
tasks=[
|
||||
TaskTemplate("Filter Cleaning", "cleaning", "time_based", 14, 3),
|
||||
TaskTemplate("Basket Cleaning", "cleaning", "time_based", 7, 2),
|
||||
TaskTemplate("Seal Inspection", "inspection", "time_based", 180, 14),
|
||||
TaskTemplate("Annual Service", "service", "time_based", 365, 30),
|
||||
],
|
||||
),
|
||||
ObjectTemplate(
|
||||
id="pool_water",
|
||||
name="Pool Water Treatment",
|
||||
category="pool",
|
||||
tasks=[
|
||||
TaskTemplate("Water Test", "inspection", "time_based", 7, 2),
|
||||
TaskTemplate("Shock Treatment", "cleaning", "time_based", 14, 3),
|
||||
TaskTemplate("Filter Backwash", "cleaning", "time_based", 7, 2),
|
||||
],
|
||||
),
|
||||
ObjectTemplate(
|
||||
id="garden_lawn_mower",
|
||||
name="Lawn Mower",
|
||||
category="pool",
|
||||
tasks=[
|
||||
TaskTemplate("Blade Sharpening", "service", "time_based", 90, 14),
|
||||
TaskTemplate("Oil Change", "service", "time_based", 365, 30),
|
||||
TaskTemplate("Air Filter", "replacement", "time_based", 365, 30),
|
||||
TaskTemplate("Spark Plug", "replacement", "time_based", 365, 30),
|
||||
],
|
||||
),
|
||||
# --- Appliances ---
|
||||
ObjectTemplate(
|
||||
id="appliance_washing_machine",
|
||||
name="Washing Machine",
|
||||
category="appliance",
|
||||
tasks=[
|
||||
TaskTemplate("Drum Cleaning", "cleaning", "time_based", 30, 7),
|
||||
TaskTemplate("Filter Cleaning", "cleaning", "time_based", 30, 7),
|
||||
TaskTemplate("Descaling", "cleaning", "time_based", 90, 14),
|
||||
TaskTemplate("Door Seal Inspection", "inspection", "time_based", 180, 14),
|
||||
],
|
||||
),
|
||||
ObjectTemplate(
|
||||
id="appliance_dishwasher",
|
||||
name="Dishwasher",
|
||||
category="appliance",
|
||||
tasks=[
|
||||
TaskTemplate("Filter Cleaning", "cleaning", "time_based", 30, 7),
|
||||
TaskTemplate("Spray Arm Cleaning", "cleaning", "time_based", 90, 14),
|
||||
TaskTemplate("Descaling", "cleaning", "time_based", 90, 14),
|
||||
],
|
||||
),
|
||||
ObjectTemplate(
|
||||
id="appliance_dryer",
|
||||
name="Dryer",
|
||||
category="appliance",
|
||||
tasks=[
|
||||
TaskTemplate("Lint Filter Cleaning", "cleaning", "time_based", 1, 0),
|
||||
TaskTemplate("Condenser Cleaning", "cleaning", "time_based", 30, 7),
|
||||
TaskTemplate("Vent Inspection", "inspection", "time_based", 365, 30),
|
||||
],
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
def get_templates_by_category(category: str) -> list[ObjectTemplate]:
|
||||
"""Return all templates for a given category."""
|
||||
return [t for t in TEMPLATES if t.category == category]
|
||||
|
||||
|
||||
def get_template_by_id(template_id: str) -> ObjectTemplate | None:
|
||||
"""Return a template by its ID."""
|
||||
for t in TEMPLATES:
|
||||
if t.id == template_id:
|
||||
return t
|
||||
return None
|
||||
|
||||
|
||||
# Re-export: template/task names + notes are localized through one flat table
|
||||
# (templates_i18n) keyed by the English source string.
|
||||
|
||||
# Re-export (the `as` alias marks it as intentional for linters): template/task
|
||||
# names + notes are localized through one flat table keyed by the English
|
||||
# source string.
|
||||
from .templates_i18n import localize_template_text as localize_template_text
|
||||
|
||||
KNOWN_TEMPLATE_IDS: frozenset[str] = frozenset(t.id for t in TEMPLATES)
|
||||
|
||||
|
||||
def get_disabled_template_ids(hass) -> set[str]: # type: ignore[no-untyped-def]
|
||||
"""Ids the admin hid from the template pickers (v2.21).
|
||||
|
||||
Read from the global entry's options; unknown ids are ignored so a stale
|
||||
list (e.g. after a template rename) can't hide anything by accident.
|
||||
"""
|
||||
from .const import CONF_DISABLED_TEMPLATE_IDS, DOMAIN, GLOBAL_UNIQUE_ID
|
||||
|
||||
for entry in hass.config_entries.async_entries(DOMAIN):
|
||||
if entry.unique_id == GLOBAL_UNIQUE_ID:
|
||||
raw = (entry.options or entry.data).get(CONF_DISABLED_TEMPLATE_IDS) or []
|
||||
return {t for t in raw if isinstance(t, str) and t in KNOWN_TEMPLATE_IDS}
|
||||
return set()
|
||||
Reference in New Issue
Block a user