Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ See [docs/cli.md](docs/cli.md) for full CLI documentation and device analysis de
| SEKO PoolDose Double Spa | PDPR1H04AW100 | 539292 | |
| SEKO POOLDOSE pH+ORP CF Group Wi-Fi | PDPR1H1HAW102 | 539187 | Alias for PDPR1H1HAW100 mapping |
| SEKO PoolDose pH | PDPH1H1HAW100 | 539176 | pH-only device |
| BWT MEDO CONNECT Wi-Fi | PDPH1H1HAW1B0 | 539494 | Based on SEKO PoolDose pH mapping |
| VÁGNER POOL VA DOS BASIC | PDHC1H1HAR1V0 | 539224 | |
| VÁGNER POOL VA DOS EXACT | PDHC1H1HAR1V1 | 539224 | Alias for PDPR1H1HAR1V0 mapping |

Expand Down
1 change: 1 addition & 0 deletions docs/device-support.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ This client has been tested with:
| SEKO PoolDose Double Spa | PDPR1H04AW100 | 539292 | |
| SEKO POOLDOSE pH+ORP CF Group Wi-Fi | PDPR1H1HAW102 | 539187 | Alias for PDPR1H1HAW100 mapping |
| SEKO PoolDose pH | PDPH1H1HAW100 | 539176 | pH-only device |
| BWT MEDO CONNECT Wi-Fi | PDPH1H1HAW1B0 | 539494 | Based on SEKO PoolDose pH mapping |
| VÁGNER POOL VA DOS BASIC | PDHC1H1HAR1V0 | 539224 | |
| VÁGNER POOL VA DOS EXACT | PDHC1H1HAR1V1 | 539224 | Alias for PDPR1H1HAR1V0 mapping |

Expand Down
128 changes: 128 additions & 0 deletions src/pooldose/mappings/model_PDPH1H1HAW1B0_FW539494.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
{
"temperature": {
"key": "w_1eomiide3",
"type": "sensor"
},
"ph": {
"key": "w_1ekeigkin",
"type": "sensor"
},
"orp": {
"key": "w_1eklenb23",
"type": "sensor"
},
"ph_type_dosing": {
"key": "w_1eklg44ro",
"type": "sensor",
"conversion": {
"|PDPH1H1HAW1B0_FW539494_LABEL_w_1eklg44ro_ALCALYNE|": "alcalyne",
"|PDPH1H1HAW1B0_FW539494_LABEL_w_1eklg44ro_ACID|": "acid"
}
},
"peristaltic_ph_dosing": {
"key": "w_1eklj6euj",
"type": "sensor",
"conversion": {
"|PDPH1H1HAW1B0_FW539494_LABEL_w_1eklj6euj_OFF|": "off",
"|PDPH1H1HAW1B0_FW539494_LABEL_w_1eklj6euj_PROPORTIONAL|": "proportional",
"|PDPH1H1HAW1B0_FW539494_LABEL_w_1eklj6euj_ON_OFF|": "on / off",
"|PDPH1H1HAW1B0_FW539494_LABEL_w_1eklj6euj_TIMED|": "timed"
}
},
"orp_type_dosing": {
"key": "w_1eklgnolb",
"type": "sensor",
"conversion": {
"|PDPH1H1HAW1B0_FW539494_LABEL_w_1eklgnolb_LOW|": "low",
"|PDPH1H1HAW1B0_FW539494_LABEL_w_1eklgnolb_HIGH|": "high"
}
},
"peristaltic_orp_dosing": {
"key": "w_1eklj12vv",
"type": "sensor",
"conversion": {
"|PDPH1H1HAW1B0_FW539494_LABEL_w_1eklj12vv_OFF|": "off",
"|PDPH1H1HAW1B0_FW539494_LABEL_w_1eklj12vv_PROPORTIONAL|": "proportional",
"|PDPH1H1HAW1B0_FW539494_LABEL_w_1eklj12vv_ON_OFF|": "on / off",
"|PDPH1H1HAW1B0_FW539494_LABEL_w_1eklj12vv_TIMED|": "timed"
}
},
"ph_calibration_type": {
"key": "w_1eklh8gb7",
"type": "sensor",
"conversion": {
"|PDPH1H1HAW1B0_FW539494_LABEL_w_1eklh8gb7_OFF|": "off",
"|PDPH1H1HAW1B0_FW539494_LABEL_w_1eklh8gb7_REFERENCE|": "reference",
"|PDPH1H1HAW1B0_FW539494_LABEL_w_1eklh8gb7_1_POINT|": "1_point",
"|PDPH1H1HAW1B0_FW539494_LABEL_w_1eklh8gb7_2_POINTS|": "2_points"
}
},
"ph_calibration_offset": {
"key": "w_1eklhs3b4",
"type": "sensor"
},
"ph_calibration_slope": {
"key": "w_1eklhs65u",
"type": "sensor"
},
"orp_calibration_slope": {
"key": "w_1eklhsase",
"type": "sensor"
},
"ofa_value": {
"key": "w_1eklhj58e",
"type": "sensor"
},
"pump_alarm": {
"key": "w_1ekga097n",
"type": "binary_sensor"
},
"ph_level_alarm": {
"key": "w_1eklf77pm",
"type": "binary_sensor"
},
"relay_alarm": {
"key": "w_1eklffdl0",
"type": "binary_sensor"
},
"relay_aux": {
"key": "w_1eklfgs1t",
"type": "binary_sensor"
},
"alarm_ofa_ph": {
"key": "w_1eklfb73r",
"type": "binary_sensor"
},
"alarm_ofa_orp": {
"key": "w_1eklfb8ob",
"type": "binary_sensor"
},
"ph_target": {
"key": "w_1ekeiqfat",
"type": "number"
},
"pause_dosing": {
"key": "w_1emtltkel",
"type": "switch"
},
"pump_monitoring": {
"key": "w_1eklft47q",
"type": "switch"
},
"frequency_input": {
"key": "w_1eklft5qt",
"type": "switch"
},
"water_meter_unit": {
"key": "w_1eklinki6",
"type": "select",
"options": {
"0": "PDPH1H1HAW1B0_FW539494_COMBO_w_1eklinki6_M_",
"1": "PDPH1H1HAW1B0_FW539494_COMBO_w_1eklinki6_LITER"
},
"conversion": {
"PDPH1H1HAW1B0_FW539494_COMBO_w_1eklinki6_M_": "m3",
"PDPH1H1HAW1B0_FW539494_COMBO_w_1eklinki6_LITER": "L"
}
}
}
34 changes: 34 additions & 0 deletions tests/test_mapping_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,3 +192,37 @@ async def test_double_spa_entity_counts(self):
assert len(types.get("number", [])) == 11
assert len(types.get("switch", [])) == 3
assert len(types.get("select", [])) == 1


class TestMedoConnectMapping:
"""Tests for the BWT MEDO CONNECT Wi-Fi mapping file (PDPH1H1HAW1B0_FW539494)."""

@pytest.mark.asyncio
async def test_load_medo_connect_mapping(self):
"""Test that the MEDO CONNECT mapping file loads successfully."""
mapping_info = await MappingInfo.load("PDPH1H1HAW1B0", "539494")
assert mapping_info.status == RequestStatus.SUCCESS
assert mapping_info.mapping is not None

@pytest.mark.asyncio
async def test_medo_connect_conversion_prefixes(self):
"""Test conversion entries use the expected model/firmware label prefix."""
mapping_info = await MappingInfo.load("PDPH1H1HAW1B0", "539494")
sensors = mapping_info.available_sensors()

ph_type = sensors["ph_type_dosing"]
assert ph_type.conversion is not None
assert "|PDPH1H1HAW1B0_FW539494_LABEL_w_1eklg44ro_ACID|" in ph_type.conversion
assert ph_type.conversion["|PDPH1H1HAW1B0_FW539494_LABEL_w_1eklg44ro_ACID|"] == "acid"

@pytest.mark.asyncio
async def test_medo_connect_entity_counts(self):
"""Test the total entity counts for the MEDO CONNECT mapping."""
mapping_info = await MappingInfo.load("PDPH1H1HAW1B0", "539494")
types = mapping_info.available_types()

assert len(types.get("sensor", [])) == 12
assert len(types.get("binary_sensor", [])) == 6
assert len(types.get("number", [])) == 1
assert len(types.get("switch", [])) == 3
assert len(types.get("select", [])) == 1