"""MAX! (Homegear) vendor transformations.""" import json import logging from typing import Any logger = logging.getLogger(__name__) def transform_contact_sensor_to_vendor(payload: dict[str, Any]) -> str: """Transform abstract contact sensor payload to MAX! format. Contact sensors are read-only. """ logger.warning("Contact sensors are read-only - SET commands should not be used") return json.dumps(payload) def transform_contact_sensor_to_abstract(payload: str) -> dict[str, Any]: """Transform MAX! contact sensor payload to abstract format. MAX! sends "true"/"false" (string or bool) on STATE topic. Transformations: - "true" or True -> "open" (window/door open) - "false" or False -> "closed" (window/door closed) Example: - MAX!: "true" - Abstract: {"contact": "open"} """ try: contact_value = payload.strip().lower() == "true" return { "contact": "open" if contact_value else "closed" } except (ValueError, TypeError) as e: logger.error(f"MAX! contact sensor failed to parse: {payload}, error: {e}") return {"contact": "closed"} def transform_thermostat_to_vendor(payload: dict[str, Any]) -> str: """Transform abstract thermostat payload to MAX! format. MAX! expects only the integer temperature value (no JSON). Transformations: - Extract 'target' temperature from payload - Convert float to integer - Return as plain string value Example: - Abstract: {'target': 22.5} - MAX!: "22" """ if "target" not in payload: logger.warning(f"MAX! thermostat payload missing 'target': {payload}") return "21" target_temp = payload["target"] if isinstance(target_temp, (int, float)): int_temp = int(round(target_temp)) return str(int_temp) logger.warning(f"MAX! invalid target temperature type: {type(target_temp)}") return "21" def transform_thermostat_to_abstract(payload: str) -> dict[str, Any]: """Transform MAX! thermostat payload to abstract format. MAX! sends only the integer temperature value (no JSON). Example: - MAX!: "22" - Abstract: {'target': 22.0, 'mode': 'heat'} """ target_temp = float(payload.strip()) return { "target": target_temp, "mode": "heat" } # Registry of handlers for this vendor HANDLERS = { ("contact_sensor", "to_vendor"): transform_contact_sensor_to_vendor, ("contact_sensor", "to_abstract"): transform_contact_sensor_to_abstract, ("contact", "to_vendor"): transform_contact_sensor_to_vendor, ("contact", "to_abstract"): transform_contact_sensor_to_abstract, ("thermostat", "to_vendor"): transform_thermostat_to_vendor, ("thermostat", "to_abstract"): transform_thermostat_to_abstract, }