Skip to content

Add support for the air circulation feature - #163

Open
mathieuletyrant wants to merge 2 commits into
gduteil:mainfrom
mathieuletyrant:air-circulation
Open

Add support for the air circulation feature#163
mathieuletyrant wants to merge 2 commits into
gduteil:mainfrom
mathieuletyrant:air-circulation

Conversation

@mathieuletyrant

@mathieuletyrant mathieuletyrant commented Aug 13, 2026

Copy link
Copy Markdown

The Cozytouch app exposes an air circulation mode — "Brassage d'air", described in the app as harmonising temperature and air quality between the rooms of the system — with a speed and a duration. None of it reached HA: the four capabilities behind it were unmapped, so the feature simply did not exist in the integration.

How they were identified

By diffing the raw setupviewv2 payload around each action in the app. Switching it on for 30 minutes moved three capabilities on all three of my rooms at once:

t=612413   102024 : 0 -> 1     on/off
t=612419   102021 : 0 -> 30    duration, in minutes
t=612424   102023 : 0 -> 30    remaining

A second dump two minutes later separated the last two: 102021 stayed at 30 while 102023 had dropped to 28, so 102021 is the setpoint and 102023 counts down.

A third capture changed only the speed. 102004 read 2 while the app showed Moyenne and moved to 3 on Rapide, again on all three rooms, which identifies it as the speed.

What this adds

Capability Entity
102004 select Air circulation speed — low / medium / high
102024 switch Air circulation
102021 number Total time, 15 to 300 minutes
102023 sensor Remaining time

The bounds are not guessed: the app's duration picker runs from 00:15 to 05:00 in 15 minute steps, which is exactly the static 15 and 300 sitting in 102025 and 102026 next to the duration.

Translations added for en and fr, plus strings.json.

All three speeds observed

102004 read 2 with the app showing Moyenne, 3 on Rapide and 1 on Lente, each time on all three rooms at once. Nothing in this mapping is inferred.

Independent of #160, #161 and #162 — it touches capability.py only in new elif branches.

🤖 Generated with Claude Code

The Cozytouch app exposes an air circulation mode with a duration, none of
which reached HA -- the three capabilities behind it were unmapped, so the
feature simply did not exist in the integration.

Identified by diffing the setupviewv2 payload before and after switching it
on for 30 minutes from the app. All three rooms changed together:

  t=612413   102024 : 0 -> 1     on/off
  t=612419   102021 : 0 -> 30    duration, in minutes
  t=612424   102023 : 0 -> 30    remaining

A second dump two minutes later separated the last two: 102021 stayed at 30
while 102023 had dropped to 28, so 102021 is the setpoint and 102023 counts
down. Nothing else moved in either dump.

102025 and 102026 sit next to them at a static 15 and 300 and look like the
bounds, so they are used as the number's range. That part is inferred rather
than observed.

The fan speed the app also offers is still unmapped: it was left untouched
during both captures, so nothing in the payload identifies it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@mathieuletyrant

Copy link
Copy Markdown
Author
Screenshot 2026-08-13 at 11 31 24 Screenshot 2026-08-13 at 11 31 18 Screenshot 2026-08-13 at 11 31 13

Completes the air circulation feature: 102004 is the speed the app calls
"Vitesse de brassage".

Isolated by changing only the speed between dumps. It read 2 while the app
showed "Moyenne", moved to 3 on "Rapide" and to 1 on "Lente", on all three
rooms at once, so it is exposed as a select over the model's speed list.

The same captures confirm the bounds guessed in the previous commit: the
app's duration picker runs from 00:15 to 05:00 in 15 minute steps, which is
exactly the 15 and 300 sitting in 102025 and 102026.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@mathieuletyrant

Copy link
Copy Markdown
Author

Update: the last inferred value is now observed. 102004 read 1 with the app showing Lente, after 2 for Moyenne and 3 for Rapide. Force-pushed, the code comment and the description no longer claim anything by elimination.

@mathieuletyrant

Copy link
Copy Markdown
Author

The bounds are no longer inferred. The capability list shared in #86 names them outright:

102004  AIR_MIXING_SPEED
102021  AIR_MIXING_DURATION
102023  AIR_MIXING_DURATION_REMAINING_TIME
102024  AIR_MIXING_ACTIVATION
102025  AIR_MIXING_MIN_DURATION
102026  AIR_MIXING_MAX_DURATION

102025 and 102026 are exactly the min and max duration I had guessed from their static 15 and 300, and the four capabilities this PR maps carry the roles the diffs suggested. Nothing in it rests on inference any more.

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.

1 participant