"""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()