Summary
get_model_infos() in model.py has no branch for modelId 1658, so an Atlantic Calypso connecté water heater falls through to the else at model.py:424 and is reported as Unknown product (1658) with type = CozytouchDeviceType.UNKNOWN. 1657 is already mapped as Calypso 200L with exactly the shape this device seems to need, so it looks like a natural template.
Thanks for the integration — it is the only thing that reaches this appliance at all, since the first-party Overkiz integration only sees the bridge Pod.
Environment
- Integration version: 1.4.0
- Home Assistant: 2026.7
- Protocol: Magellan (
apis.groupe-atlantic.com/magellan). This appliance joins the house Wi-Fi directly and acts as its own gateway (gateway type: 1000), so it is invisible on the Overkiz surface — that account's enduserAPI/setup/devices returns only the CozyTouch bridge Pod.
- Device: reported name
Calypso connecté, modelId 1658, firmware 2.7.3 (capability 121), 84 capabilities.
What happens today
Falling into the fallback sets only name, type = UNKNOWN, and HVACModes = {0: OFF, 4: HEAT}. Beyond the display name, two concrete effects traceable in the code:
-
HeatingModes is never set. Capability 87 is declared as a select bound to modelList = "HeatingModes" (capability.py:183-188), but select.py:77-81 falls back to self._list = {-1: "Undefined"} when that key is absent from modelInfos. The heating-mode select therefore offers a single Undefined option, so MANUEL / ECO+ / PROG cannot be chosen from HA even though the device reports and accepts the mode.
Confirmed live (2026-07-24) after installing v1.4 against this device: the resulting
heating-mode select entity reads exactly Undefined, while capability 87 simultaneously
reports 3 (ECO+). So the device's mode is known but unselectable from HA — this is
observed behaviour, not just inferred from the code.
-
Capability 99 is mislabelled. capability.py:202-208 branches on type == WATER_HEATER; with UNKNOWN this device exposes it as dhw_pump (mdi:faucet) rather than resistance (mdi:radiator).
Evidence from this unit
All read-only cloud reads; no writes exercised.
| ID |
Upstream name |
Observed |
Corroboration |
| 87 |
heating_mode |
3 |
The CozyTouch app showed ECO+ selected at the same moment, and the app's mode tabs match the {0: MANUEL, 3: ECO+, 4: PROG} enum. Only 3 = ECO+ is independently confirmed; 0 and 4 are taken from your mapping, not verified here. |
| 121 |
firmware_version |
2.7.3 |
Well-formed, matches the app. |
| 179 |
wifi_rssi |
-46 |
Matches -47 dBm measured independently by the Wi-Fi controller the device is associated with. |
| 219 |
wifi_ssid |
(redacted) |
Matches the SSID the device actually joined. |
| 22 |
target_temperature_dhw |
54.5 |
Matches the setpoint shown in the app. Note this model exposes neither 160 nor 161, which capability.py uses for the bounds of the temperature_adjustment_number. |
| 265 / 267 |
tank middle / bottom temperature |
54.83 / 57.75 |
Plausible and consistent with the setpoint. |
Two smaller observations that may be useful:
- Capability 312 (the
# For test entry, Temp_312) reads 54.5 on this unit — identical to capability 22's setpoint.
- Capabilities 88 and 98 carry product/serial-style identifiers. Values omitted here; happy to share privately if they help identify the exact commercial variant.
Of the 84 capability IDs this device reports, 36 are mapped by v1.4's capability.py and 48 are not:
15, 23, 58, 150, 164, 168, 182, 188, 218, 223, 224, 228, 230, 234, 244, 252,
253, 278, 280, 281, 284, 285, 286, 288, 290, 304, 307, 308, 309, 310, 311,
329, 330, 331, 332, 333, 336, 337, 338, 339, 340, 351, 381,
105011, 105012, 105122, 105300, 105301
That list is orthogonal to the model mapping (those are covered by the "create entities for unknown capabilities" option) — included only in case an unmapped-ID inventory for a Calypso variant is of any use.
Suggested change
If 1658 is simply an adjacent Calypso variant, extending the existing branch would cover it:
elif modelId in (1657, 1658):
modelInfos["name"] = "Calypso 200L"
modelInfos["type"] = CozytouchDeviceType.WATER_HEATER
modelInfos["HVACModes"] = {
0: HVACMode.OFF,
4: HVACMode.HEAT,
}
modelInfos["HeatingModes"] = {
0: HEATING_MODE_MANUAL,
3: HEATING_MODE_ECO_PLUS,
4: HEATING_MODE_PROG,
}
A separate branch may be preferable if 1658 deserves its own display name — I cannot determine the exact commercial designation or tank capacity from the API; the device reports its own name as Calypso connecté. I'd defer to you on naming.
Caveat stated plainly: since I have only read this device, I can confirm the fallback behaviour and the reported values, but not that mode-setting works once HeatingModes is populated.
Offer
A full 84-capability dump for this device is attached (dump_json output, scrubbed of
address/household/serial/account identifiers; capabilities 88, 98 and 219 redacted), and I'm happy to test a patch against the live unit and report back.
Full 84-capability dump for this unit (scrubbed)
Account/address/household identifiers removed; capabilities 88, 98 and 219 redacted.
| capabilityId |
value |
modificationDate |
| 15 |
2 |
1784704657 |
| 22 |
54.5000000000000000000 |
1784704656 |
| 23 |
50.0000000000000000000 |
1784704656 |
| 57 |
0 |
1784704656 |
| 58 |
0 |
1784704656 |
| 59 |
5597 |
1784873793 |
| 86 |
1 |
1784704656 |
| 87 |
3 |
1784753243 |
| 88 |
«redacted — product/serial-style id» |
1784704656 |
| 98 |
«redacted — product/serial-style id» |
1784704656 |
| 99 |
0 |
1784857148 |
| 121 |
2.7.3 |
1784704656 |
| 150 |
[[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]] |
1784704657 |
| 152 |
0 |
1784704656 |
| 164 |
10 |
1784704654 |
| 165 |
0 |
1784704656 |
| 168 |
16133 |
1784704657 |
| 179 |
-52 |
1784872988 |
| 182 |
0 |
1784704657 |
| 188 |
2 |
1784704656 |
| 218 |
0 |
1784797977 |
| 219 |
«redacted — wifi SSID» |
1784704656 |
| 222 |
[0,0] |
1784704657 |
| 223 |
3 |
1784704657 |
| 224 |
113 |
1784704657 |
| 226 |
[0,0] |
1784704657 |
| 227 |
0 |
1784704656 |
| 228 |
20.0000000000000000000 |
1784704656 |
| 230 |
0 |
1784704656 |
| 231 |
55.0000000000000000000 |
1784704656 |
| 232 |
0 |
1784704656 |
| 234 |
62.0000000000000000000 |
1784704656 |
| 244 |
3 |
1784704655 |
| 245 |
[[540,1140],[0,0],[0,0]] |
1784704657 |
| 246 |
[[540,1140],[0,0],[0,0]] |
1784704657 |
| 247 |
[[540,1140],[0,0],[0,0]] |
1784704657 |
| 248 |
[[540,1140],[0,0],[0,0]] |
1784704657 |
| 249 |
[[540,1140],[0,0],[0,0]] |
1784704657 |
| 250 |
[[540,1140],[0,0],[0,0]] |
1784704657 |
| 251 |
[[540,1140],[0,0],[0,0]] |
1784704657 |
| 252 |
62.0000000000000000000 |
1784704656 |
| 253 |
50.0000000000000000000 |
1784704656 |
| 258 |
240 |
1784704656 |
| 265 |
54.21000000000000000000 |
1784856934 |
| 267 |
57.7500000000000000000 |
1784704656 |
| 268 |
377 |
1784856973 |
| 270 |
451 |
1784704656 |
| 271 |
78 |
1784797988 |
| 278 |
0 |
1784857428 |
| 280 |
15.0000000000000000000 |
1784704656 |
| 281 |
0 |
1784857148 |
| 283 |
0 |
1784704656 |
| 284 |
0 |
1784704656 |
| 285 |
0 |
1784704656 |
| 286 |
0 |
1784704656 |
| 288 |
2 |
1784704656 |
| 290 |
[[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]] |
1784704657 |
| 304 |
1 |
1784704656 |
| 307 |
480 |
1784704656 |
| 308 |
0 |
1784704657 |
| 309 |
0 |
1784704657 |
| 310 |
3 |
1784704657 |
| 311 |
33 |
1784704657 |
| 312 |
54.5000000000000000000 |
1784704656 |
| 315 |
7200 |
1784704655 |
| 329 |
1 |
1784704655 |
| 330 |
15 |
1784704656 |
| 331 |
1440 |
1784704656 |
| 332 |
15 |
1784704656 |
| 333 |
1440 |
1784704655 |
| 336 |
3 |
1784704657 |
| 337 |
0 |
1784753249 |
| 338 |
1 |
1784753249 |
| 339 |
0 |
1784857148 |
| 340 |
1 |
1784704655 |
| 351 |
0 |
1784704655 |
| 381 |
1 |
1784704656 |
| 105011 |
16133 |
1784704656 |
| 105012 |
15 |
1784704656 |
| 105122 |
0 |
1784704656 |
| 105300 |
62.0000000000000000000 |
1784704656 |
| 105301 |
50 |
1784704655 |
| 105906 |
84 |
1784753248 |
| 105907 |
84 |
1784753248 |
Summary
get_model_infos()inmodel.pyhas no branch formodelId 1658, so an Atlantic Calypso connecté water heater falls through to theelseatmodel.py:424and is reported asUnknown product (1658)withtype = CozytouchDeviceType.UNKNOWN.1657is already mapped asCalypso 200Lwith exactly the shape this device seems to need, so it looks like a natural template.Thanks for the integration — it is the only thing that reaches this appliance at all, since the first-party Overkiz integration only sees the bridge Pod.
Environment
apis.groupe-atlantic.com/magellan). This appliance joins the house Wi-Fi directly and acts as its own gateway (gatewaytype: 1000), so it is invisible on the Overkiz surface — that account'senduserAPI/setup/devicesreturns only the CozyTouch bridge Pod.Calypso connecté,modelId 1658, firmware2.7.3(capability 121), 84 capabilities.What happens today
Falling into the fallback sets only
name,type = UNKNOWN, andHVACModes = {0: OFF, 4: HEAT}. Beyond the display name, two concrete effects traceable in the code:HeatingModesis never set. Capability 87 is declared as aselectbound tomodelList = "HeatingModes"(capability.py:183-188), butselect.py:77-81falls back toself._list = {-1: "Undefined"}when that key is absent frommodelInfos. The heating-mode select therefore offers a singleUndefinedoption, so MANUEL / ECO+ / PROG cannot be chosen from HA even though the device reports and accepts the mode.Confirmed live (2026-07-24) after installing v1.4 against this device: the resulting
heating-mode
selectentity reads exactlyUndefined, while capability 87 simultaneouslyreports
3(ECO+). So the device's mode is known but unselectable from HA — this isobserved behaviour, not just inferred from the code.
Capability 99 is mislabelled.
capability.py:202-208branches ontype == WATER_HEATER; withUNKNOWNthis device exposes it asdhw_pump(mdi:faucet) rather thanresistance(mdi:radiator).Evidence from this unit
All read-only cloud reads; no writes exercised.
heating_mode3{0: MANUEL, 3: ECO+, 4: PROG}enum. Only3 = ECO+is independently confirmed;0and4are taken from your mapping, not verified here.firmware_version2.7.3wifi_rssi-46-47 dBmmeasured independently by the Wi-Fi controller the device is associated with.wifi_ssidtarget_temperature_dhw54.5capability.pyuses for the bounds of thetemperature_adjustment_number.54.83/57.75Two smaller observations that may be useful:
# For testentry,Temp_312) reads54.5on this unit — identical to capability 22's setpoint.Of the 84 capability IDs this device reports, 36 are mapped by v1.4's
capability.pyand 48 are not:That list is orthogonal to the model mapping (those are covered by the "create entities for unknown capabilities" option) — included only in case an unmapped-ID inventory for a Calypso variant is of any use.
Suggested change
If 1658 is simply an adjacent Calypso variant, extending the existing branch would cover it:
A separate branch may be preferable if 1658 deserves its own display name — I cannot determine the exact commercial designation or tank capacity from the API; the device reports its own name as
Calypso connecté. I'd defer to you on naming.Caveat stated plainly: since I have only read this device, I can confirm the fallback behaviour and the reported values, but not that mode-setting works once
HeatingModesis populated.Offer
A full 84-capability dump for this device is attached (
dump_jsonoutput, scrubbed ofaddress/household/serial/account identifiers; capabilities 88, 98 and 219 redacted), and I'm happy to test a patch against the live unit and report back.
Full 84-capability dump for this unit (scrubbed)
Account/address/household identifiers removed; capabilities 88, 98 and 219 redacted.
254.500000000000000000050.000000000000000000000559713«redacted — product/serial-style id»«redacted — product/serial-style id»02.7.3[[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]]010016133-52020«redacted — wifi SSID»[0,0]3113[0,0]020.0000000000000000000055.0000000000000000000062.00000000000000000003[[540,1140],[0,0],[0,0]][[540,1140],[0,0],[0,0]][[540,1140],[0,0],[0,0]][[540,1140],[0,0],[0,0]][[540,1140],[0,0],[0,0]][[540,1140],[0,0],[0,0]][[540,1140],[0,0],[0,0]]62.000000000000000000050.000000000000000000024054.2100000000000000000057.750000000000000000037745178015.0000000000000000000000002[[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]]14800033354.50000000000000000007200115144015144030101011613315062.0000000000000000000508484