After multiple availability issues of the CO2 sensors using the OH Netatmo binding (cloud solution), i have changed now to direct sensor access using the OH homekit binding. This binding uses the pairing numbers labelled on the CO2 sensors and direct access through sensor’s IP and port 5001.
Thus, the whole thing is independant now from the Netatmo cloud and their availability. Additionally, the poll time can now be 60 secs while the cloud variant updates at a minimum of 10 minutes only.
It turns out my Netatmo Weather Stations support HomeKit as well. I didn’t know or notice, because I use the Android app, and they don’t support HomeKit configuration there. Using my workphone I was able to get the pairing code in the iOS app, and after temporarily letting the Weather Station join my primary Wi-Fi network, I was able to discover it with the HomeKit binding. This is really awesome, especially today where the cloud service has been unavailable.
The only remaining issue I seem to have is that the Weather Station is discovered as a bridge and the additional indoor modules and outdoor module as bridged-accessory. So while I’m able to get readings from the additional modules, I can’t seem to get readings from the station itself, because the bridge doesn’t have any channels. I need to dig further into this. Also, one of my indoor modules reports 0 ppm for the sensor-carbon-dioxide#carbon-dioxide-level-13, which is strange. Another one is working correctly.
@AndrewFG - perhaps you can help me figure this out. I did a trace while initializing the bridge, and it seems the bridge itself exposes some characteristics. For this specific Netatmo Weather Station, in my setup I have two additional indoor modules and one outdoor module:
Interesting observation. The observation is not (currently) anticipated in the OH code. So you are not missing anything. However the observation is oddly not totally surprising to me:
it does NOT comply with HomeKit specification “bridge or accessory only” semantics, but
it does comply with its accessory / service / characteristic tree syntax
As a general rule even a bridge is allowed to have static data characteristics like model number (which in OH we map to properties), but bridges are NOT supposed to have dynamic data characteristics (which in OH would map to channels).
So it looks like you have discovered a kind of bridge-plus-accessory chimera. Which is not (yet) modelled in OH.
So I have some requests:
Can you please send me the full JSON by PM?
It should be possible to handle such chimera by one of two methods: a) let bridge recursively implement bridged-accessory channels directly on itself, or b) implement a “phantom” bridged-accessory within itself. Personally I think b) is probably easier to code, but a) may be easier for users to comprehend. => Can you please open a GitHub issue? And say if you prefer a) or b).
PS thinking about the OH semantic tagging schema, the “phantom” bridged-accessory model would probably work better.
EDIT .. just a wild crazy idea: could you try forcing the implementation of the phantom accessory as follows. .. Who knows, it might just work..
Are we sticking with this and just adding a discovery mechanism for it? Comparing with the Netatmo modelling, here the channels are directly on the bridge:
I am inclined to say “yes”. I would add discovery only in case the bridge has one or more dynamic channels. And documentation obviously. Probably the thing should have a label/description indicating the accessory thing is hosted on the bridge. .. But let me test with your json first.
This maybe a stupid question: did you distinguish between the Homekit binding and the Homekit system integration? Which one do you use?
I applied the Homekit binding which “only” imports Homekit devices into OH while the system integration exports OH accessories through a bridge to Homekit.
Only the new HomeKit binding can be used for this scenario.
I can now share my observations after running this side by side since yesterday evening.
Speed of state updates seems quite similar. This is an example of an additional indoor module, i.e. a module that isn’t on Wi-Fi directly and there doesn’t directly integrate with either Netatmo servers or HomeKit, but rather communicates through the main indoor module:
2026-01-04 13:13:52.868 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_Bedroom_CO2' changed from 501 ppm to 507 ppm (source: org.openhab.core.thing$netatmo:indoor:home:indoor:indoor2:airquality#co2)
2026-01-04 13:14:01.987 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_Bedroom_CO2_HomeKit' changed from 501 ppm to 507 ppm (source: org.openhab.core.thing$homekit:bridged-accessory:netatmo1:bedroom:sensor-carbon-dioxide#carbon-dioxide-level-13)
2026-01-04 13:23:57.559 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_Bedroom_CO2' changed from 507 ppm to 502 ppm (source: org.openhab.core.thing$netatmo:indoor:home:indoor:indoor2:airquality#co2)
2026-01-04 13:24:44.262 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_Bedroom_CO2_HomeKit' changed from 507 ppm to 502 ppm (source: org.openhab.core.thing$homekit:bridged-accessory:netatmo1:bedroom:sensor-carbon-dioxide#carbon-dioxide-level-13)
2026-01-04 13:33:54.465 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_Bedroom_CO2_HomeKit' changed from 502 ppm to 499 ppm (source: org.openhab.core.thing$homekit:bridged-accessory:netatmo1:bedroom:sensor-carbon-dioxide#carbon-dioxide-level-13)
2026-01-04 13:34:02.529 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_Bedroom_CO2' changed from 502 ppm to 499 ppm (source: org.openhab.core.thing$netatmo:indoor:home:indoor:indoor2:airquality#co2)
2026-01-04 13:44:10.692 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_Bedroom_CO2' changed from 499 ppm to 489 ppm (source: org.openhab.core.thing$netatmo:indoor:home:indoor:indoor2:airquality#co2)
2026-01-04 13:44:38.777 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_Bedroom_CO2_HomeKit' changed from 499 ppm to 489 ppm (source: org.openhab.core.thing$homekit:bridged-accessory:netatmo1:bedroom:sensor-carbon-dioxide#carbon-dioxide-level-13)
2026-01-04 13:54:17.961 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_Bedroom_CO2' changed from 489 ppm to 494 ppm (source: org.openhab.core.thing$netatmo:indoor:home:indoor:indoor2:airquality#co2)
2026-01-04 13:54:41.461 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_Bedroom_CO2_HomeKit' changed from 489 ppm to 494 ppm (source: org.openhab.core.thing$homekit:bridged-accessory:netatmo1:bedroom:sensor-carbon-dioxide#carbon-dioxide-level-13)
2026-01-04 14:04:11.722 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_Bedroom_CO2_HomeKit' changed from 494 ppm to 502 ppm (source: org.openhab.core.thing$homekit:bridged-accessory:netatmo1:bedroom:sensor-carbon-dioxide#carbon-dioxide-level-13)
2026-01-04 14:04:21.151 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_Bedroom_CO2' changed from 494 ppm to 502 ppm (source: org.openhab.core.thing$netatmo:indoor:home:indoor:indoor2:airquality#co2)
2026-01-04 14:14:16.218 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_Bedroom_CO2_HomeKit' changed from 502 ppm to 498 ppm (source: org.openhab.core.thing$homekit:bridged-accessory:netatmo1:bedroom:sensor-carbon-dioxide#carbon-dioxide-level-13)
2026-01-04 14:14:25.405 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_Bedroom_CO2' changed from 502 ppm to 498 ppm (source: org.openhab.core.thing$netatmo:indoor:home:indoor:indoor2:airquality#co2)
2026-01-04 14:24:22.599 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_Bedroom_CO2_HomeKit' changed from 498 ppm to 509 ppm (source: org.openhab.core.thing$homekit:bridged-accessory:netatmo1:bedroom:sensor-carbon-dioxide#carbon-dioxide-level-13)
2026-01-04 14:24:31.580 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_Bedroom_CO2' changed from 498 ppm to 509 ppm (source: org.openhab.core.thing$netatmo:indoor:home:indoor:indoor2:airquality#co2)
As i can be seen, sometimes HomeKit is faster, sometimes it’s slower. I don’t know why that is, but I’m actually now considering linking my items to the channels of both bindings. This redundancy would remove the dependency to the cloud, but also ensure fastest possible updates.
This approach could be a disaster if the cloud binding would ever update with old values, but I haven’t seen that happening.
The situation for a main module is similar:
2026-01-04 13:13:52.853 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_FamilyRoom_CO2' changed from 459 ppm to 451 ppm (source: org.openhab.core.thing$netatmo:weather-station:home:indoor:airquality#co2)
2026-01-04 13:14:01.979 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_FamilyRoom_CO2_HomeKit' changed from 459 ppm to 451 ppm (source: org.openhab.core.thing$homekit:bridged-accessory:netatmo1:family_room:sensor-carbon-dioxide#carbon-dioxide-level-13)
2026-01-04 13:23:57.558 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_FamilyRoom_CO2' changed from 451 ppm to 458 ppm (source: org.openhab.core.thing$netatmo:weather-station:home:indoor:airquality#co2)
2026-01-04 13:24:44.260 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_FamilyRoom_CO2_HomeKit' changed from 451 ppm to 458 ppm (source: org.openhab.core.thing$homekit:bridged-accessory:netatmo1:family_room:sensor-carbon-dioxide#carbon-dioxide-level-13)
2026-01-04 13:34:02.518 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_FamilyRoom_CO2' changed from 458 ppm to 478 ppm (source: org.openhab.core.thing$netatmo:weather-station:home:indoor:airquality#co2)
2026-01-04 13:34:34.629 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_FamilyRoom_CO2_HomeKit' changed from 458 ppm to 478 ppm (source: org.openhab.core.thing$homekit:bridged-accessory:netatmo1:family_room:sensor-carbon-dioxide#carbon-dioxide-level-13)
2026-01-04 13:44:10.689 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_FamilyRoom_CO2' changed from 478 ppm to 451 ppm (source: org.openhab.core.thing$netatmo:weather-station:home:indoor:airquality#co2)
2026-01-04 13:44:38.777 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_FamilyRoom_CO2_HomeKit' changed from 478 ppm to 451 ppm (source: org.openhab.core.thing$homekit:bridged-accessory:netatmo1:family_room:sensor-carbon-dioxide#carbon-dioxide-level-13)
2026-01-04 13:54:17.952 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_FamilyRoom_CO2' changed from 451 ppm to 450 ppm (source: org.openhab.core.thing$netatmo:weather-station:home:indoor:airquality#co2)
2026-01-04 13:54:41.459 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_FamilyRoom_CO2_HomeKit' changed from 451 ppm to 450 ppm (source: org.openhab.core.thing$homekit:bridged-accessory:netatmo1:family_room:sensor-carbon-dioxide#carbon-dioxide-level-13)
2026-01-04 14:04:11.719 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_FamilyRoom_CO2_HomeKit' changed from 450 ppm to 441 ppm (source: org.openhab.core.thing$homekit:bridged-accessory:netatmo1:family_room:sensor-carbon-dioxide#carbon-dioxide-level-13)
2026-01-04 14:04:21.144 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_FamilyRoom_CO2' changed from 450 ppm to 441 ppm (source: org.openhab.core.thing$netatmo:weather-station:home:indoor:airquality#co2)
2026-01-04 14:14:16.216 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_FamilyRoom_CO2_HomeKit' changed from 441 ppm to 459 ppm (source: org.openhab.core.thing$homekit:bridged-accessory:netatmo1:family_room:sensor-carbon-dioxide#carbon-dioxide-level-13)
2026-01-04 14:14:25.392 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_FamilyRoom_CO2' changed from 441 ppm to 459 ppm (source: org.openhab.core.thing$netatmo:weather-station:home:indoor:airquality#co2)
2026-01-04 14:24:22.596 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_FamilyRoom_CO2_HomeKit' changed from 459 ppm to 441 ppm (source: org.openhab.core.thing$homekit:bridged-accessory:netatmo1:family_room:sensor-carbon-dioxide#carbon-dioxide-level-13)
2026-01-04 14:24:31.572 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Netatmo_FamilyRoom_CO2' changed from 459 ppm to 441 ppm (source: org.openhab.core.thing$netatmo:weather-station:home:indoor:airquality#co2)
Next, I see that battery levels are reported differently. HomeKit reports lower levels. I don’t know why that is, and I don’t think anything can be done with that if we don’t know the formulas involved. I will have a look at the Netatmo API and binding just to check if we are missing some calculation to fit the values between 0% and 100%.
Some channels are exposed as different types.
In HomeKit, battery levels are exposed as Dimmer rather than Number as in Netatmo. That seems a bit strange, I would assume Number as correct for battery levels.
In HomeKit, low battery is exposed as Contact rather than Switch. That seems also a bit strange, because that is translated in OPEN/CLOSED and is usually used for doors/windows.
Thanks for this detailed description of your scenario. I have also linked my items to the channels of both bindings with the same intention. Will further observe this now. But can at least say that i had Homekit CO2 data for the hours of Netatmo cloud downtime on Saturday.
@laursen the default Item type generally depends on the Characteristic attributes according to the following code.. (but of course you may raise a PR or Issue if you want to change this..)
Thanks, I’ll have a look at the PR. The channels I was referring to with that comment were channels that exist in the Netatmo binding, but are not exposed by HomeKit. This is because they are not supported by HomeKit, or by Netatmo, or both. So there’s really nothing to do about that.
I saw the same with Velux Active with Netatmo, where for example the battery level for the departure switch and sensor switch is not exposed by HomeKit. In that case it’s a choice made by Velux or Netatmo, since it’s totally possible to expose battery levels through HomeKit.
One channel/item for my Netatmo CO2 sensors seems not to work using the Homekit binding: the CO2 level detection contact. Purpose is the application for automations.
Acc. to the specification the contact should change in Homekit @ >1600ppm but nothing happens if the CO2 level is higher. Shown state is continuously CLOSED.
I can’t crosscheck because this channel is neither available within the Netatmo OH binding nor within the Netatmo iOS app.
Just for the avoidance of doubt: Can you confirm that the binding IS creating a channel for this datum? This confirms that the accessory IS providing a Characteristic for this. And that therefore your issue is that the accessory is NOT changing the value of that Characteristic? If so, in order to check if it is a problem in the accessory or the binding, we would need to see the JSON for that accessory both before and after the respective Characteristic should have changed its value.