Skip to content

Add device mapping for PDPH1H1HAW100 (FW 539176)#22

Merged
lmaertin merged 1 commit intolmaertin:mainfrom
pwntester:main
Mar 13, 2026
Merged

Add device mapping for PDPH1H1HAW100 (FW 539176)#22
lmaertin merged 1 commit intolmaertin:mainfrom
pwntester:main

Conversation

@pwntester
Copy link

@pwntester pwntester commented Mar 8, 2026

Problem

The PoolDose pH device reports PDPH1H1HAW100 as its PRODUCT_CODE with firmware code 539176, but no mapping file exists for this model/firmware combination.

This causes MappingInfo.load() to fail because it looks for model_PDPH1H1HAW100_FW539176.json which does not exist. Without the mapping, instant_values() returns UNKNOWN_ERROR.

Error in Home Assistant:

Failed setup, will retry: API returned status: RequestStatus.UNKNOWN_ERROR

Error in Python client:

Error loading model mapping: [Errno 2] No such file or directory:
  .../pooldose/mappings/model_PDPH1H1HAW100_FW539176.json

Error fetching instant values: RequestStatus.UNKNOWN_ERROR

Solution

Add a new mapping file model_PDPH1H1HAW100_FW539176.json for this pH-only device variant.

Widget keys were identified using the built-in device analyzer (python -m pooldose --host <ip> --analyze-all) against a live device. Many widget keys are shared with PDPR1H1HAW100_FW539187, but with notable differences:

  • Temperature uses a different widget key (w_1eomiide3 vs w_1eommf39k)
  • No CL sensor (pH-only model)
  • Peristaltic ORP dosing uses a different widget key (w_1eklj12vv vs w_1eo1s18s8)
  • Several ORP-specific widgets are absent (orp_calibration_type, orp_calibration_offset, orp_level_alarm, flow_rate_alarm, etc.)
  • All label/conversion prefixes use PDPH1H1HAW100_FW539176

Changes

  • mappings/model_PDPH1H1HAW100_FW539176.json: New mapping file with sensors, binary sensors, numbers, switches, and selects for this device

Device info

  {
    "MODEL": "PoolDose",
    "MODEL_ID": "PDPH1H1HAW100",
    "FW_VERSION": "1.8",
    "SW_VERSION": "3.00(Build8)",
    "FW_CODE": "539176"
  }

Tested on real device

Verified with a PoolDose pH device (PRODUCT_CODE: PDPH1H1HAW100, FW code: 539176).

Before fix:

Error loading model mapping: [Errno 2] No such file or directory:
.../pooldose/mappings/model_PDPH1H1HAW100_FW539176.json

Error fetching instant values: RequestStatus.UNKNOWN_ERROR

After fix (python -m pooldose --host 192.168.107.201):

(.venv) bash-5.3$ python -m pooldose --host 192.168.107.201
Python PoolDose Client
========================================
Connecting to PoolDose device at 192.168.107.201
Using HTTP on port 80
Failed to fetch MAC address via getmac library for IP: 192.168.107.201
Connected successfully!

Device Information:
  Name: xxxxxxx
  Serial: xxxxxxx
  Model: PoolDose
  Firmware: 1.8

Sensor Values:
  Temperature: 10.5 °C
  Ph: 6.8
  Orp: 0 mV
  Ph Type Dosing: acid
  Peristaltic Ph Dosing: proportional
  Orp Type Dosing: low
  Peristaltic Orp Dosing: proportional
  Ph Calibration Type: 2_points
  Ph Calibration Offset: 4596 mV
  Ph Calibration Slope: 59.74 mV
  Orp Calibration Slope: 0 mV
  Ofa Value: 45 min

Alarms & Status:
  Pump Alarm: ON
  Ph Level Alarm: OFF
  Relay Alarm: ON
  Relay Aux: OFF
  Alarm Ofa Ph: OFF
  Alarm Ofa Orp: OFF

Setpoints:
  Ph Target: 7.2 (Range: 6-8)

Switches:
  Pause Dosing: ON
  Pump Monitoring: ON
  Frequency Input: OFF

Settings:
  Water Meter Unit: L

Connection completed successfully!

Test suite

(.venv) bash-5.3$ pytest
=============================================================================================== test session starts ================================================================================================
platform darwin -- Python 3.12.0, pytest-8.4.1, pluggy-1.6.0
rootdir: /Users/pwntester/src/github.com/lmaertin/python-pooldose
configfile: pyproject.toml
testpaths: tests
plugins: anyio-4.8.0, cov-6.2.1, asyncio-1.0.0
asyncio: mode=Mode.AUTO, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function
collected 123 items

tests/test_client.py ................                                                                                                                                                                        [ 13%]
tests/test_device_analyzer.py ...............................                                                                                                                                                [ 38%]
tests/test_device_analyzer_integration.py ...........                                                                                                                                                        [ 47%]
tests/test_instant_values.py .............................                                                                                                                                                   [ 70%]
tests/test_mapping_info.py ....                                                                                                                                                                              [ 73%]
tests/test_mock_client_set_value.py .....                                                                                                                                                                    [ 78%]
tests/test_request_handler.py ......                                                                                                                                                                         [ 82%]
tests/test_ssl_support.py ....................                                                                                                                                                               [ 99%]
tests/test_static_values.py .                                                                                                                                                                                [100%]

=============================================================================================== 123 passed in 1.95s ================================================================================================

This pH-only model variant was missing a mapping file, causing
UNKNOWN_ERROR when fetching instant values via the client or
Home Assistant integration.
@lmaertin
Copy link
Owner

Thanks for this additional mapping file!

@lmaertin lmaertin merged commit b5d78e2 into lmaertin:main Mar 13, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants