Summary
Pentair UltraTemp ETi hybrid heaters can report and accept a ScreenLogic heat mode value of 5 for the app's Dual mode. screenlogicpy currently only defines HEAT_MODE values 0..4 and validates heat modes with 0 <= mode < 5, so callers cannot set Dual and consumers such as Home Assistant fail when they read mode 5.
Observed behavior
On a Pentair ScreenLogic system with an UltraTemp ETi Hybrid Heater:
- Gas Only reports as raw heat mode
2
- H.Pump Only reports as raw heat mode
3
- Dual reports as raw heat mode
5
- The Pentair app's Hybrid option fell back to H.Pump Only on this system, so I am not proposing a separate Hybrid value here
When the heater is in Dual mode, Home Assistant's ScreenLogic climate entity raises:
ValueError: 5 is not a valid HEAT_MODE
The exception happens when Home Assistant calls:
HEAT_MODE(self.entity_data[VALUE.HEAT_MODE][ATTR.VALUE]).name.lower()
Packet capture evidence
I captured traffic while setting Dual from the official Pentair app. The app sent a normal SetHeatMode request for spa body 1 with heat mode 5.
The relevant payload was:
6c00fa300c000000000000000100000005000000
Decoded:
0x30fa little-endian = 12538, matching the SetHeatMode - 1 action used by ScreenLogic clients
- payload length
12
- controller id
0
- body
1
- heat mode
5
Local validation
I added a small local Home Assistant custom service that bypasses only the screenlogicpy heat-mode validator for mode 5 and calls the existing low-level async_request_set_heat_mode with body=1, mode=5.
With that local workaround:
- the controller accepts the command
- the heater switches to Dual
- once
HEAT_MODE is patched locally to include DUAL = 5, Home Assistant reads the climate preset as dual
Suggested fix
In screenlogicpy.device_const.heat.HEAT_MODE, add:
And allow mode 5 in ScreenLogicGateway._is_valid_heatmode.
If you prefer to gate this on equipment flags, the system reports EQUIPMENT_FLAG.HYBRID_HEATER, but the raw mode itself appears to be a normal ScreenLogic heat mode value for UltraTemp ETi systems.
Downstream impact
Home Assistant currently pins screenlogicpy==0.10.2 for its ScreenLogic integration. Once screenlogicpy supports HEAT_MODE.DUAL, Home Assistant can expose Dual as a climate preset for systems with EQUIPMENT_FLAG.HYBRID_HEATER and avoid crashing when the controller reports mode 5.
Summary
Pentair UltraTemp ETi hybrid heaters can report and accept a ScreenLogic heat mode value of
5for the app's Dual mode.screenlogicpycurrently only definesHEAT_MODEvalues0..4and validates heat modes with0 <= mode < 5, so callers cannot set Dual and consumers such as Home Assistant fail when they read mode5.Observed behavior
On a Pentair ScreenLogic system with an UltraTemp ETi Hybrid Heater:
235When the heater is in Dual mode, Home Assistant's ScreenLogic climate entity raises:
The exception happens when Home Assistant calls:
Packet capture evidence
I captured traffic while setting Dual from the official Pentair app. The app sent a normal
SetHeatModerequest for spa body1with heat mode5.The relevant payload was:
Decoded:
0x30falittle-endian =12538, matching theSetHeatMode - 1action used by ScreenLogic clients12015Local validation
I added a small local Home Assistant custom service that bypasses only the
screenlogicpyheat-mode validator for mode5and calls the existing low-levelasync_request_set_heat_modewithbody=1, mode=5.With that local workaround:
HEAT_MODEis patched locally to includeDUAL = 5, Home Assistant reads the climate preset asdualSuggested fix
In
screenlogicpy.device_const.heat.HEAT_MODE, add:And allow mode
5inScreenLogicGateway._is_valid_heatmode.If you prefer to gate this on equipment flags, the system reports
EQUIPMENT_FLAG.HYBRID_HEATER, but the raw mode itself appears to be a normal ScreenLogic heat mode value for UltraTemp ETi systems.Downstream impact
Home Assistant currently pins
screenlogicpy==0.10.2for its ScreenLogic integration. OncescreenlogicpysupportsHEAT_MODE.DUAL, Home Assistant can expose Dual as a climate preset for systems withEQUIPMENT_FLAG.HYBRID_HEATERand avoid crashing when the controller reports mode5.