NEW] Control Flair Vents with Hubitat - Free Open Source App and Driver

Hi All,
@mluck, my apologies, I do not know how to answer your question on v0.9 -- I do not see a version in the groovy source or the github interface to identify differently.
@shimbone, after discovering the devices, I did upgrade the source back to the most recent revision.

@ljbotero Thank you for the wonderful work here -- vent control seem to work great.

Misbah

how did you do this part? I was intending to do the same. Used the old version to discover the devices, then wanted to upgrade to the new version of the integration. So I used the HPM update feature, but that just created a new instance. Curious how it worked for you?

did a copy of the raw code from github and pasted it over the app code for the vent app.

1 Like

Hi everyone, I finally was able to find some time to fix the problem of device discovery, I just pushed a fix on version 0.11. It was a dumb check for a parameter that was being always sent as null and preventing the data from being post processed.

1 Like

Jaime, welcome back and thanks for looking.

Like others, I ended up going back to an earlier version, successfully discovered all my vents, then upgraded the app.

While the discovery worked, I’m still seeing errors in the log (sample below). And I noticed that vents with room-active=False are still getting opened automatically. That shouldn’t happen, right?

Log

app:22512024-07-14 07:30:10.174 PMerrorHTTP response code: 404, body: NOT FOUND

app:22512024-07-14 07:30:10.157 PMerrorHTTP response code: 404, body: NOT FOUND

app:22512024-07-14 07:30:10.154 PMerrorHTTP response code: 404, body: NOT FOUND

app:22512024-07-14 07:30:10.066 PMerrorHTTP response code: 404, body: NOT FOUND

app:22512024-07-14 07:30:09.633 PMdebugProcessing Room data for Vent Powder Room
[data:[attributes:[active:false, air-return:false, created-at:2024-06-29T20:44:34.061284+00:00, current-humidity:null, current-temperature-c:null, frozen-pipe-pet-protect:true, heat-cool-mode:FLOAT, hold-reason:Set by Mark, hold-until:null, hold-until-schedule-event:false, humidity-away-max:80, humidity-away-min:10, level:null, name:Powder Room, occupancy-mode:Flair Auto, preheat-precool:true, pucks-inactive:SensorInactive, room-away-mode:Smart Away, room-conclusion-mode:COOL, room-type:null, set-point-c:22.5, set-point-manual:false, state-updated-at:2024-07-12T22:43:33.333092+00:00, temp-away-max-c:22.5, temp-away-min-c:16.0, updated-at:2024-07-12T22:43:33.347916+00:00, windows:null], id:153213, relationships:[bridges:[data:, links:[related:/api/rooms/153213/bridges, self:/api/rooms/153213/relationships/bridges]], current-conclusions:[links:[related:/api/rooms/153213/current-conclusions]], hvac-units:[data:, links:[related:/api/rooms/153213/hvac-units, self:/api/rooms/153213/relationships/hvac-units]], occupancy-conclusions:[links:[related:/api/rooms/153213/occupancy-conclusions]], occupants:[links:[related:/api/rooms/153213/occupants, self:/api/rooms/153213/relationships/occupants]], puck-apps:[links:[related:/api/rooms/153213/puck-apps, self:/api/rooms/153213/relationships/puck-apps]], pucks:[data:, links:[related:/api/rooms/153213/pucks, self:/api/rooms/153213/relationships/pucks]], remote-sensors:[data:[[id:1eaf442c-9bb3-423b-956f-7197e0d5aeb6, type:remote-sensors]], links:[related:/api/rooms/153213/remote-sensors, self:/api/rooms/153213/relationships/remote-sensors]], room-auto-conclusions:[links:[related:/api/rooms/153213/room-auto-conclusions]], room-states:[links:[related:/api/rooms/153213/room-states]], structure:[data:[id:66254, type:structures], links:[related:/api/rooms/153213/structure, self:/api/rooms/153213/relationships/structure]], thermostat:[data:[id:null, type:thermostats], links:[related:/api/rooms/153213/thermostat, self:/api/rooms/153213/relationships/thermostat]], vents:[data:[[id:683a8ebb-3c98-58af-67e9-c054ffa84d73, type:vents]], links:[related:/api/rooms/153213/vents, self:/api/rooms/153213/relationships/vents]], zones:[data:[[id:688354, type:zones]], links:[related:/api/rooms/153213/zones, self:/api/rooms/153213/relationships/zones]]], type:rooms], meta:[self:/api/vents/683a8ebb-3c98-58af-67e9-c054ffa84d73/room]]

app:22512024-07-14 07:30:09.641 PMdebugProcessing Vent data for Vent Frog East
[data:[attributes:[connected-gateway-name:Flair Bridge Upstairs, created-at:2024-07-15T00:25:34.576866+00:00, duct-pressure:98.781, duct-temperature-c:20.66, firmware-version-s:159, lights:0, motor-current:4096, motor-run-time:1093, percent-open:95, rssi:-75, system-voltage:3.2], id:cef7d2c7-8706-402a-8798-231c12ff4e35, relationships:[vent:[data:[id:009e66fe-4d03-5506-0a2a-0d48ec7d29bf, type:vents], links:[related:/api/vent-sensor-readings/cef7d2c7-8706-402a-8798-231c12ff4e35/vent]]], type:vent-sensor-readings], meta:[self:/api/vents/009e66fe-4d03-5506-0a2a-0d48ec7d29bf/current-reading]]

app:22512024-07-14 07:30:09.467 PMerrorjava.util.NoSuchElementException: Cannot access first() element from an empty List on line 569 (method handleRoomGet)

app:22512024-07-14 07:30:09.097 PMdebugProcessing Room data for Vent Basement Bedroom
[data:[attributes:[active:true, air-return:false, created-at:2024-06-29T20:41:10.921693+00:00, current-humidity:69.0, current-temperature-c:21.0001, frozen-pipe-pet-protect:true, heat-cool-mode:FLOAT, hold-reason:Set by Mark, hold-until:null, hold-until-schedule-event:false, humidity-away-max:80, humidity-away-min:10, level:null, name:Basement Suite, occupancy-mode:Flair Auto, preheat-precool:true, pucks-inactive:Active, room-away-mode:Smart Away, room-conclusion-mode:HEAT, room-type:null, set-point-c:22.5, set-point-manual:false, state-updated-at:2024-07-12T22:26:02.791169+00:00, temp-away-max-c:22.5, temp-away-min-c:16.0, updated-at:2024-07-12T22:26:02.794008+00:00, windows:null], id:153208, relationships:[bridges:[data:, links:[related:/api/rooms/153208/bridges, self:/api/rooms/153208/relationships/bridges]], current-conclusions:[links:[related:/api/rooms/153208/current-conclusions]], hvac-units:[data:, links:[related:/api/rooms/153208/hvac-units, self:/api/rooms/153208/relationships/hvac-units]], occupancy-conclusions:[links:[related:/api/rooms/153208/occupancy-conclusions]], occupants:[links:[related:/api/rooms/153208/occupants, self:/api/rooms/153208/relationships/occupants]], puck-apps:[links:[related:/api/rooms/153208/puck-apps, self:/api/rooms/153208/relationships/puck-apps]], pucks:[data:, links:[related:/api/rooms/153208/pucks, self:/api/rooms/153208/relationships/pucks]], remote-sensors:[data:[[id:ec17a274-834b-48da-b895-01d2b19c433b, type:remote-sensors]], links:[related:/api/rooms/153208/remote-sensors, self:/api/rooms/153208/relationships/remote-sensors]], room-auto-conclusions:[links:[related:/api/rooms/153208/room-auto-conclusions]], room-states:[links:[related:/api/rooms/153208/room-states]], structure:[data:[id:66254, type:structures], links:[related:/api/rooms/153208/structure, self:/api/rooms/153208/relationships/structure]], thermostat:[data:[id:5d028e6a-1f19-4ccd-bdbb-bb0452a44856, type:thermostats], links:[related:/api/rooms/153208/thermostat, self:/api/rooms/153208/relationships/thermostat]], vents:[data:[[id:af7116e2-1730-5f39-8b33-7b48e013e759, type:vents], [id:b5b5203a-1b25-5b5f-2123-6eff44e83b75, type:vents]], links:[related:/api/rooms/153208/vents, self:/api/rooms/153208/relationships/vents]], zones:[data:[[id:688358, type:zones]], links:[related:/api/rooms/153208/zones, self:/api/rooms/153208/relationships/zones]]], type:rooms], meta:[self:/api/vents/b5b5203a-1b25-5b5f-2123-6eff44e83b75/room]]

Hi @mluck , thanks! Yes, the vents that are not active are left at zero opening. However, if the airflow is limited to less than 30% flow, all vents are adjusted proportionally, including the inactive vents. This ensures your HVAC is protected and always allows at least 30% airflow. As far as the error logs, thanks for sharing, I will investigate and see if I can pinpoint root case.

Yes I was aware of this rule, but I’m seeing situations where just a very few vents (of 25 total) are closed and yet a vent in an inactive room is not closing and/or staying closed.

For example, right now, of 25 vents, 3 of them are in 2 inactive rooms, and the other 22 are in active rooms, yet all of them are 100% opened. If I close the 3 manually, they reopen after a little while.

Flair mobile app is in manual mode and I don’t have any other automations running on the vents other than your awesome integration.

Hey @ljbotero, any progress in looking at the errors post-discovery? I'm still struggling with vents closing or staying closed when room-active = False. Thanks!

EDIT: Also, I'm trying to setup battery monitoring for my vents. I see that "Voltage" is an attribute of the driver, but none of my vent devices have a voltage attribute in the device details view. Is this expected behavior?

Hi @mluck, I've fund a code fix for the "Cannot access first() element from an empty List", which was caused by some vents not having an associated thermostat from the Flair point of view. The fix should address this and could potentially have been the cause for the disabled vents still updating, as I could not replicate the behavior you explained. Please get the latest via Package manager or directly from Github

1 Like

I am having some trouble installing this app (I had it previously installed, but ran into some errors, and I decided to remove it all and start from scratch.)

When trying to install from HPM, I can find the app, but as it installs it, it errors out:

If I try and install the app code manually via Github copy/paste, I get an error when trying to save it:

Anyone else experiencing this?

I missed checking something in. Please try again, should be good now

1 Like

I got the app installed and devices discovered, but now I can't seem to control the vents themselves. I am not seeing a 'percent-open' state listed in the vent devices (i believe I saw that state in previous driver versions), and when I try and use the Set Level command to change the vent, the physical vent never changes...

EDIT: Now that I'm looking closer, it looks like the vent device in Hubitat is possibly missing a bunch of states that are supposed to be there (percent-open, rssi, duct-pressure, system-voltage, etc.) and only has states pertaining to the room, not the vent:

P.S. Thanks for all your hard work on this; very grateful!

Are you able to control your vents from the Flair app? Trying to help narrow it down…

Jaime, I installed the latest beta version, but I’m still having the same two problems:

  1. When rooms are inactive, the vents in that room don’t close. And if I close them myself, they don’t stay closed
  2. I continue to get “ HTTP response code: 404, body: NOT FOUND” in the logs.

Any ideas? Know you’re busy, so totally understand, but sincere thank you!

EDIT; Noticed also if create a clean new instance of the app on my development hub, I don’t get percent-open either. Same as @quinnjudge.

Yep, vents open/close as expected from both the Flair website as well as their phone app.

I went ahead and installed from scratch, I found open-percentage was erroing the first time was set. I fixed that. As far as the vents being changed while disabled, I did not find anything apparent from a closed box analysis. I'll do some testing and see if I can replicate that behavior.

update: I found some other issues that are now fixed. Latest version 0.14 should be fully functional based on the end to end testing results I've got, including all problems reported above. BTW, the very first time the app is run, all vents will be in 100% open including any disabled ones, this is because the app needs to collect some stats in order to calculate the flow and rate of cooling/heating for each individual vent.

I can confirm that, after removing and adding the latest version from scratch, I am now able to open and close vents from within the Hubitat device - thanks!

FYI - the 'percent-open' and 'level' states never appeared on their own inside the Hubitat device page (I left it alone for a full day); only when I issued a Set Level command did the state populate in the Current States list. Is this expected? Also, none of the other device-specific states are appearing in the list (rssi, voltage, etc.)

Okay thanks. Think I’ll install from scratch just so it’s clean. Will report back.

When you say “disabled”, I’m assuming that means when room-active is False, correct? If that’s the case, what will trigger the app to close the vent in an already inactive room if the app starts with all vents fully opened? Do I need to toggle room-active to True and then False after installing the app to get vents to close automatically?

So, I reinstalled Flair from scratch with v0.14, and I'm still experiencing the following:

I'm getting HTTP response code: 404, body: NOT FOUND in the logs. I can't tell if this actually causes a problem. Do you know what 404 response code is? I assume this is coming from the Flair API?

Also, did you see my question above about battery/voltage readings from the app?

I think I just ran into another bug.

When a Flair room has a temp sensor linked to it, I am able to adjust the vent levels via Hubitat (change is reflected almost immediately in the Flair website, though it takes a minute or so for the change to actually get to the physical vent).

But if I want to control a vent that does not have a temp sensor associated (per Flair), the Hubitat command to open or close does not seem to get to Flair, and the vent just sits there, even though the Hubitat device reflects the change. At that point, the device status is no longer in sync between the Hubitat device and Flair's website/mobile app.