diff --git a/apps/abstraction/transformation.py b/apps/abstraction/transformation.py index cdadac8..37516f9 100644 --- a/apps/abstraction/transformation.py +++ b/apps/abstraction/transformation.py @@ -55,9 +55,13 @@ def _transform_thermostat_simulator_to_abstract(payload: dict[str, Any]) -> dict def _transform_light_zigbee2mqtt_to_vendor(payload: dict[str, Any]) -> dict[str, Any]: """Transform abstract light payload to zigbee2mqtt format. - zigbee2mqtt uses 'state' instead of 'power': + Transformations: + - power: 'on'/'off' -> state: 'ON'/'OFF' + - brightness: 0-100 -> brightness: 0-254 + + Example: - Abstract: {'power': 'on', 'brightness': 100} - - zigbee2mqtt: {'state': 'ON', 'brightness': 100} + - zigbee2mqtt: {'state': 'ON', 'brightness': 254} """ vendor_payload = payload.copy() @@ -66,14 +70,25 @@ def _transform_light_zigbee2mqtt_to_vendor(payload: dict[str, Any]) -> dict[str, power_value = vendor_payload.pop("power") vendor_payload["state"] = power_value.upper() if isinstance(power_value, str) else power_value + # Transform brightness: 0-100 (%) -> 0-254 (zigbee2mqtt range) + if "brightness" in vendor_payload: + abstract_brightness = vendor_payload["brightness"] + if isinstance(abstract_brightness, (int, float)): + # Convert percentage (0-100) to zigbee2mqtt range (0-254) + vendor_payload["brightness"] = round(abstract_brightness * 254 / 100) + return vendor_payload def _transform_light_zigbee2mqtt_to_abstract(payload: dict[str, Any]) -> dict[str, Any]: """Transform zigbee2mqtt light payload to abstract format. - zigbee2mqtt uses 'state' instead of 'power': - - zigbee2mqtt: {'state': 'ON', 'brightness': 100} + Transformations: + - state: 'ON'/'OFF' -> power: 'on'/'off' + - brightness: 0-254 -> brightness: 0-100 + + Example: + - zigbee2mqtt: {'state': 'ON', 'brightness': 254} - Abstract: {'power': 'on', 'brightness': 100} """ abstract_payload = payload.copy() @@ -83,6 +98,13 @@ def _transform_light_zigbee2mqtt_to_abstract(payload: dict[str, Any]) -> dict[st state_value = abstract_payload.pop("state") abstract_payload["power"] = state_value.lower() if isinstance(state_value, str) else state_value + # Transform brightness: 0-254 (zigbee2mqtt range) -> 0-100 (%) + if "brightness" in abstract_payload: + vendor_brightness = abstract_payload["brightness"] + if isinstance(vendor_brightness, (int, float)): + # Convert zigbee2mqtt range (0-254) to percentage (0-100) + abstract_payload["brightness"] = round(vendor_brightness * 100 / 254) + return abstract_payload