diff --git a/apps/abstraction/transformation.py b/apps/abstraction/transformation.py index 7fd2637..835e8ed 100644 --- a/apps/abstraction/transformation.py +++ b/apps/abstraction/transformation.py @@ -404,6 +404,76 @@ def _transform_relay_hottis_modbus_to_abstract(payload: str) -> dict[str, Any]: """ return {"power": payload.strip()} + +# ============================================================================ +# HANDLER FUNCTIONS: three_phase_powermeter - hottis_modbus technology +# ============================================================================ + +def _transform_three_phase_powermeter_hottis_modbus_to_vendor(payload: dict[str, Any]) -> dict[str, Any]: + """Transform abstract three_phase_powermeter payload to hottis_modbus format. + + energy: float = Field(..., description="Total energy in kWh") + total_power: float = Field(..., description="Total power in W") + phase1_power: float = Field(..., description="Power for phase 1 in W") + phase2_power: float = Field(..., description="Power for phase 2 in W") + phase3_power: float = Field(..., description="Power for phase 3 in W") + phase1_voltage: float = Field(..., description="Voltage for phase 1 in V") + phase2_voltage: float = Field(..., description="Voltage for phase 2 in V") + phase3_voltage: float = Field(..., description="Voltage for phase 3 in V") + phase1_current: float = Field(..., description="Current for phase 1 in A") + phase2_current: float = Field(..., description="Current for phase 2 in A") + phase3_current: float = Field(..., description="Current for phase 3 in A") + + + """ + + vendor_payload = { + "energy": payload.get("energy", 0.0), + "total_power": payload.get("total_power", 0.0), + "phase1_power": payload.get("phase1_power", 0.0), + "phase2_power": payload.get("phase2_power", 0.0), + "phase3_power": payload.get("phase3_power", 0.0), + "phase1_voltage": payload.get("phase1_voltage", 0.0), + "phase2_voltage": payload.get("phase2_voltage", 0.0), + "phase3_voltage": payload.get("phase3_voltage", 0.0), + "phase1_current": payload.get("phase1_current", 0.0), + "phase2_current": payload.get("phase2_current", 0.0), + "phase3_current": payload.get("phase3_current", 0.0), + } + + return vendor_payload + + +def _transform_three_phase_powermeter_hottis_modbus_to_abstract(payload: str) -> dict[str, Any]: + """Transform hottis_modbus three_phase_powermeter payload to abstract format. + + Transformations: + - current_heating_setpoint -> target (as float) + - local_temperature -> current (as float) + - system_mode -> mode + + Example: + - zigbee2mqtt: {'current_heating_setpoint': 15, 'local_temperature': 23, 'system_mode': 'heat'} + - Abstract: {'target': 15.0, 'current': 23.0, 'mode': 'heat'} + """ + payload = json.loads(payload) + abstract_payload = { + "energy": payload.get("energy", 0.0), + "total_power": payload.get("total_power", 0.0), + "phase1_power": payload.get("phase1_power", 0.0), + "phase2_power": payload.get("phase2_power", 0.0), + "phase3_power": payload.get("phase3_power", 0.0), + "phase1_voltage": payload.get("phase1_voltage", 0.0), + "phase2_voltage": payload.get("phase2_voltage", 0.0), + "phase3_voltage": payload.get("phase3_voltage", 0.0), + "phase1_current": payload.get("phase1_current", 0.0), + "phase2_current": payload.get("phase2_current", 0.0), + "phase3_current": payload.get("phase3_current", 0.0), + } + + return abstract_payload + + # ============================================================================ # HANDLER FUNCTIONS: max technology (Homegear MAX!) # ============================================================================ @@ -513,6 +583,10 @@ TRANSFORM_HANDLERS: dict[tuple[str, str, str], TransformHandler] = { ("relay", "shelly", "to_abstract"): _transform_relay_shelly_to_abstract, ("relay", "hottis_modbus", "to_vendor"): _transform_relay_hottis_modbus_to_vendor, ("relay", "hottis_modbus", "to_abstract"): _transform_relay_hottis_modbus_to_abstract, + + # Three-Phase Powermeter transformations + ("three_phase_powermeter", "hottis_modbus", "to_vendor"): _transform_three_phase_powermeter_hottis_modbus_to_vendor, + ("three_phase_powermeter", "hottis_modbus", "to_abstract"): _transform_three_phase_powermeter_hottis_modbus_to_abstract, } diff --git a/config/devices.yaml b/config/devices.yaml index 4300518..6d4dde2 100644 --- a/config/devices.yaml +++ b/config/devices.yaml @@ -796,8 +796,8 @@ devices: - device_id: powermeter_caroutlet name: Car Outlet - type: threephase_powermeter - cap_version: "threephase_powermeter@1.0.0" + type: three_phase_powermeter + cap_version: "three_phase_powermeter@1.0.0" technology: hottis_modbus topics: state: "caroutlet/powermeter"