Homekit binding stops working after upgrading to OH 3.3.0

Hi,
Yesterday I tried to upgrade OH 3.2.0 to OH 3.3.0 however I’m experiencing some issue with HomeKit binding, looks like it couldn’t start and I have tried to restart a few times without luck. Downgrade to 3.2.0 solves the problem. I’m running OH on QNAP as Docker container. Below is the exception printed out in log file:

2022-07-11 15:25:09.794 [ERROR] [nhab.io.homekit.internal.HomekitImpl] - bundle org.openhab.io.homekit:3.3.0 (281)[org.openhab.io.homekit.internal.HomekitImpl(331)] : Error during instantiation of the implementation object
java.lang.reflect.InvocationTargetException: null
	at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:?]
	at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:?]
	at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:?]
	at java.lang.reflect.Constructor.newInstance(Constructor.java:490) ~[?:?]
	at org.apache.felix.scr.impl.inject.internal.ComponentConstructorImpl.newInstance(ComponentConstructorImpl.java:316) ~[bundleFile:?]
	at org.apache.felix.scr.impl.manager.SingleComponentManager.createImplementationObject(SingleComponentManager.java:286) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.SingleComponentManager.createComponent(SingleComponentManager.java:115) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:1000) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:973) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:918) [bundleFile:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse$1.run(ServiceFactoryUse.java:220) [org.eclipse.osgi-3.17.200.jar:?]
	at java.security.AccessController.doPrivileged(Native Method) ~[?:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.factoryGetService(ServiceFactoryUse.java:217) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.getService(ServiceFactoryUse.java:118) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceConsumer$2.getService(ServiceConsumer.java:48) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.getService(ServiceRegistrationImpl.java:547) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.getService(ServiceRegistry.java:533) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.framework.BundleContextImpl.getService(BundleContextImpl.java:655) [org.eclipse.osgi-3.17.200.jar:?]
	at org.apache.felix.scr.impl.manager.SingleRefPair.getServiceObject(SingleRefPair.java:88) [bundleFile:?]
	at org.apache.felix.scr.impl.inject.methods.BindMethod.getServiceObject(BindMethod.java:675) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.DependencyManager.getServiceObject(DependencyManager.java:2556) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.prebind(DependencyManager.java:1398) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.DependencyManager.prebind(DependencyManager.java:1827) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.AbstractComponentManager.collectDependencies(AbstractComponentManager.java:1057) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:953) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:918) [bundleFile:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse$1.run(ServiceFactoryUse.java:220) [org.eclipse.osgi-3.17.200.jar:?]
	at java.security.AccessController.doPrivileged(Native Method) ~[?:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.factoryGetService(ServiceFactoryUse.java:217) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.getService(ServiceFactoryUse.java:118) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceConsumer$2.getService(ServiceConsumer.java:48) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.getService(ServiceRegistrationImpl.java:547) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.getService(ServiceRegistry.java:533) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.framework.BundleContextImpl.getService(BundleContextImpl.java:655) [org.eclipse.osgi-3.17.200.jar:?]
	at org.apache.felix.scr.impl.manager.SingleRefPair.getServiceObject(SingleRefPair.java:88) [bundleFile:?]
	at org.apache.felix.scr.impl.inject.methods.BindMethod.getServiceObject(BindMethod.java:675) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.DependencyManager.getServiceObject(DependencyManager.java:2556) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.DependencyManager.invokeUnbindMethod(DependencyManager.java:2201) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.SingleComponentManager.invokeUnbindMethod(SingleComponentManager.java:466) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.DependencyManager$MultipleDynamicCustomizer.removedService(DependencyManager.java:395) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.DependencyManager$MultipleDynamicCustomizer.removedService(DependencyManager.java:301) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerRemoved(ServiceTracker.java:1226) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerRemoved(ServiceTracker.java:1121) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.untrack(ServiceTracker.java:981) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:1160) [bundleFile:?]
	at org.apache.felix.scr.impl.BundleComponentActivator$ListenerInfo.serviceChanged(BundleComponentActivator.java:114) [bundleFile:?]
	at org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:120) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:956) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:234) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:936) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:873) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.unregister(ServiceRegistrationImpl.java:241) [org.eclipse.osgi-3.17.200.jar:?]
	at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.unregister(AbstractComponentManager.java:952) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.unregister(AbstractComponentManager.java:915) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(RegistrationManager.java:140) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.AbstractComponentManager.unregisterService(AbstractComponentManager.java:994) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.AbstractComponentManager.doDeactivate(AbstractComponentManager.java:844) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.AbstractComponentManager.deactivateInternal(AbstractComponentManager.java:825) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.AbstractComponentManager.dispose(AbstractComponentManager.java:589) [bundleFile:?]
	at org.apache.felix.scr.impl.manager.ConfigurableComponentHolder.disposeComponents(ConfigurableComponentHolder.java:718) [bundleFile:?]
	at org.apache.felix.scr.impl.BundleComponentActivator.dispose(BundleComponentActivator.java:487) [bundleFile:?]
	at org.apache.felix.scr.impl.Activator.disposeComponents(Activator.java:613) [bundleFile:?]
	at org.apache.felix.scr.impl.Activator.access$300(Activator.java:70) [bundleFile:?]
	at org.apache.felix.scr.impl.Activator$ScrExtension.destroy(Activator.java:451) [bundleFile:?]
	at org.apache.felix.scr.impl.AbstractExtender$1.run(AbstractExtender.java:216) [bundleFile:?]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) [?:?]
	at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
	at org.apache.felix.scr.impl.AbstractExtender.destroyExtension(AbstractExtender.java:238) [bundleFile:?]
	at org.apache.felix.scr.impl.AbstractExtender.bundleChanged(AbstractExtender.java:132) [bundleFile:?]
	at org.apache.felix.scr.impl.Activator.bundleChanged(Activator.java:217) [bundleFile:?]
	at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:944) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:234) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEventPrivileged(EquinoxEventPublisher.java:229) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:138) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:130) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor.publishModuleEvent(EquinoxContainerAdaptor.java:217) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.container.Module.publishEvent(Module.java:499) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.container.Module.doStop(Module.java:658) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.container.Module.stop(Module.java:521) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.decStartLevel(ModuleContainer.java:1888) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.doContainerStartLevel(ModuleContainer.java:1763) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.container.SystemModule.stopWorker(SystemModule.java:275) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.framework.EquinoxBundle$SystemBundle$EquinoxSystemModule.stopWorker(EquinoxBundle.java:208) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.container.Module.doStop(Module.java:660) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.container.Module.stop(Module.java:521) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.container.SystemModule.stop(SystemModule.java:207) [org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.framework.EquinoxBundle$SystemBundle$EquinoxSystemModule$1.run(EquinoxBundle.java:226) [org.eclipse.osgi-3.17.200.jar:?]
	at java.lang.Thread.run(Thread.java:829) [?:?]
Caused by: java.lang.NullPointerException
	at java.util.Objects.requireNonNull(Objects.java:221) ~[?:?]
	at java.util.Arrays$ArrayList.<init>(Arrays.java:4323) ~[?:?]
	at java.util.Arrays.asList(Arrays.java:4310) ~[?:?]
	at org.openhab.io.homekit.internal.accessories.HomekitAccessoryFactory.getRequiredCharacteristics(HomekitAccessoryFactory.java:154) ~[?:?]
	at org.openhab.io.homekit.internal.accessories.HomekitAccessoryFactory.addMandatoryCharacteristics(HomekitAccessoryFactory.java:299) ~[?:?]
	at org.openhab.io.homekit.internal.accessories.HomekitAccessoryFactory.getMandatoryCharacteristicsFromItem(HomekitAccessoryFactory.java:278) ~[?:?]
	at org.openhab.io.homekit.internal.accessories.HomekitAccessoryFactory.create(HomekitAccessoryFactory.java:174) ~[?:?]
	at org.openhab.io.homekit.internal.HomekitChangeListener.createRootAccessories(HomekitChangeListener.java:370) ~[?:?]
	at java.lang.Iterable.forEach(Iterable.java:75) ~[?:?]
	at org.openhab.io.homekit.internal.HomekitChangeListener.<init>(HomekitChangeListener.java:131) ~[?:?]
	at org.openhab.io.homekit.internal.HomekitImpl.<init>(HomekitImpl.java:99) ~[?:?]
	... 90 more

Anybody know what could go wrong? Many thanks!

@somy
thanks for reporting. it looks like a bug and i need your help to narrow it down.
for some reason homekit cannot create a homekit accessories. it says something like “unknown accessory”.

following would help to understand it

  • can you enable more logging. you cannot do it with following command in karaf
log:set TRACE org.openhab.io.homekit.internal

after this command you will see following messages in the log file
" Constructing … of accessory type …"
please share the last one before you get the exception

  • if you cannot enable more logging, please share your configuration and i will try reproduce

Hi @yfre
Thanks for your reply! I have enabled trace log below is the log statement before the exception:

2022-07-12 09:25:49.224 [TRACE] [mekit.internal.HomekitChangeListener] - Item gWavinKitchenThermostat is a HomeKit accessory of types [THERMOSTAT=Empty]. Primary type is THERMOSTAT
2022-07-12 09:25:49.230 [TRACE] [.accessories.HomekitAccessoryFactory] - Constructing gWavinKitchenThermostat of accessory type Thermostat
2022-07-12 09:25:49.235 [TRACE] [.accessories.HomekitAccessoryFactory] - Mandatory characteristics: [Item:WavinKitchenCurrentMode (Type=StringItem, State=OFF, Label=Kitchen Current Mode, Category=null, Groups=[gWavinKitchenThermostat, gWavinCurrentMode])  HomeKit type: 'Dummy' characteristic: 'CurrentHeatingCoolingMode', Item:WavinKitchenCurrentTemp (Type=NumberItem, State=23.6, Label=Kitchen Current Temperature, Category=temperature, Groups=[gWavinKitchenThermostat])  HomeKit type: 'Dummy' characteristic: 'CurrentTemperature', Item:WavinKitchenTargetTemp (Type=NumberItem, State=20, Label=Kitchen Target Temperature, Category=temperature, Groups=[gWavinKitchenThermostat])  HomeKit type: 'Dummy' characteristic: 'TargetTemperature', Item:WavinKitchenTargetMode (Type=StringItem, State=HEAT, Label=Kitchen Target Mode, Category=null, Groups=[gWavinKitchenThermostat, gWavinTargetMode])  HomeKit type: 'Dummy' characteristic: 'TargetHeatingCoolingMode']
2022-07-12 09:25:49.240 [TRACE] [.accessories.HomekitAccessoryFactory] - Optional characteristics for item gWavinKitchenThermostat: []
2022-07-12 09:25:49.245 [TRACE] [mekit.internal.HomekitChangeListener] - Item gWavinGuestRoomThermostat is a HomeKit accessory of types [THERMOSTAT=Empty]. Primary type is THERMOSTAT
2022-07-12 09:25:49.249 [TRACE] [.accessories.HomekitAccessoryFactory] - Constructing gWavinGuestRoomThermostat of accessory type Thermostat
2022-07-12 09:25:49.269 [TRACE] [.accessories.HomekitAccessoryFactory] - Mandatory characteristics: [Item:WavinGuestRoomTargetTemp (Type=NumberItem, State=20, Label=Guest Room Target Temperature, Category=temperature, Groups=[gWavinGuestRoomThermostat])  HomeKit type: 'Dummy' characteristic: 'TargetTemperature', Item:WavinGuestRoomCurrentMode (Type=StringItem, State=OFF, Label=Guest Room Current Mode, Category=null, Groups=[gWavinGuestRoomThermostat, gWavinCurrentMode])  HomeKit type: 'Dummy' characteristic: 'CurrentHeatingCoolingMode', Item:WavinGuestRoomCurrentTemp (Type=NumberItem, State=23.7, Label=Guest Room Current Temperature, Category=temperature, Groups=[gWavinGuestRoomThermostat])  HomeKit type: 'Dummy' characteristic: 'CurrentTemperature', Item:WavinGuestRoomTargetMode (Type=StringItem, State=HEAT, Label=Guest Room Target Mode, Category=null, Groups=[gWavinGuestRoomThermostat, gWavinTargetMode])  HomeKit type: 'Dummy' characteristic: 'TargetHeatingCoolingMode']
2022-07-12 09:25:49.278 [TRACE] [.accessories.HomekitAccessoryFactory] - Optional characteristics for item gWavinGuestRoomThermostat: []
2022-07-12 09:25:49.285 [TRACE] [mekit.internal.HomekitChangeListener] - Item gWavinLivingRoomThermostat is a HomeKit accessory of types [THERMOSTAT=Empty]. Primary type is THERMOSTAT
2022-07-12 09:25:49.305 [TRACE] [.accessories.HomekitAccessoryFactory] - Constructing gWavinLivingRoomThermostat of accessory type Thermostat
2022-07-12 09:25:49.312 [TRACE] [.accessories.HomekitAccessoryFactory] - Mandatory characteristics: [Item:WavinLivingRoomCurrentMode (Type=StringItem, State=OFF, Label=Living Room Current Mode, Category=null, Groups=[gWavinLivingRoomThermostat, gWavinCurrentMode])  HomeKit type: 'Dummy' characteristic: 'CurrentHeatingCoolingMode', Item:WavinLivingRoomTargetMode (Type=StringItem, State=HEAT, Label=Living Room Target Mode, Category=null, Groups=[gWavinLivingRoomThermostat, gWavinTargetMode])  HomeKit type: 'Dummy' characteristic: 'TargetHeatingCoolingMode', Item:WavinLivingRoomTargetTemp (Type=NumberItem, State=20, Label=Living Room Target Temperature, Category=temperature, Groups=[gWavinLivingRoomThermostat])  HomeKit type: 'Dummy' characteristic: 'TargetTemperature', Item:WavinLivingRoomCurrentTemp (Type=NumberItem, State=24, Label=Living Room Current Temperature, Category=temperature, Groups=[gWavinLivingRoomThermostat])  HomeKit type: 'Dummy' characteristic: 'CurrentTemperature']
2022-07-12 09:25:49.317 [TRACE] [.accessories.HomekitAccessoryFactory] - Optional characteristics for item gWavinLivingRoomThermostat: []
2022-07-12 09:25:49.322 [TRACE] [mekit.internal.HomekitChangeListener] - Item Ventilation_current_mode is a HomeKit accessory of types [DUMMY=CurrentHeaterCoolerState]. Primary type is DUMMY
2022-07-12 09:25:49.328 [TRACE] [.accessories.HomekitAccessoryFactory] - Constructing Ventilation_current_mode of accessory type Dummy
2022-07-12 09:25:49.334 [ERROR] [nhab.io.homekit.internal.HomekitImpl] - bundle org.openhab.io.homekit:3.3.0 (279)[org.openhab.io.homekit.internal.HomekitImpl(312)] : Error during instantiation of the implementation object

The configuration of the accessory in question:

Group gNilanVentilationHomeKit			"Ventilation HomeKit"	(gNilanVentilation)	//{homekit="HeaterCooler"}
//Below are needed for both native and HomeBridge integration	
Switch HomeKitVentilationActiveItem "Ventilation Active"  	(gNilanVentilationHomeKit)	{homekit="ActiveStatus"}
//Below are needed for native HomeKit integration
Number	prmUserTemperature	"Ventilation Set Air Temperature [%.1f °C]"		<temperature>	(gNilanVentilationHomeKit)			{homekit="CoolingThresholdTemperature" [minValue=10, maxValue=30, step=1], channel="modbus:data:Ventilation:VentilationWrite:hold4746:number"}
Number	prmUserFanSpeed   "Ventilation Set Ventilation Speed [%d %%]"				<fan>		(gNilanVentilationHomeKit)			{homekit="RotationSpeed", channel="modbus:data:Ventilation:VentilationWrite:hold4747:number"}
Number	VAL_DEV_TSENS3	"Ventilation Extract Air Temperature [%.1f °C]"			<temperature>	(gNilanVentilationHomeKit)	{homekit="CurrentTemperature" [minValue=0, maxValue=50, step=1],channel="modbus:data:Ventilation:TemperatureRead:input5154:number"}
Number	HomeKitHeatingThreshold	"Ventilation Set Heating Threshold [%.1f °C]"		<temperature>	(gNilanVentilationHomeKit)			{homekit="HeatingThresholdTemperature" [minValue=10, maxValue=30, step=1], channel="modbus:data:Ventilation:VentilationWrite:hold4746:number"}
String 			Ventilation_current_mode  	    "Ventilation Current Mode" 		        (gNilanVentilationHomeKit) 			{homekit="CurrentHeaterCoolerState" [HEATING="HEAT", COOLING="COOL", IDLE="IDLE"]}
String 			Ventilation_target_mode  	    "Ventilation Target Mode" 				(gNilanVentilationHomeKit)           {homekit="TargetHeaterCoolerState" [AUTO="AUTO", COOL="COOL", HEAT="HEAT"]}

Edit: sorry I think I know why. I have commented out {homekit=“HeaterCooler”} on group level (because I’d like to switch back to HomeBridge setup due to missing filter accessory and group support). However this configuration seems to work with 3.2.0 - maybe there are some changes introduced to 3.3.0 which seems to have a different fault tolerance. Anyways I’d suggest to ignore/skip the erroneous accessory so the HomeKit binding still work for the good ones.

@somy thanks for the log.
the issue is not commented out part as such but missing accessories type information. i.e. it cannot understand to which type this line belongs.

String 			Ventilation_current_mode  	    "Ventilation Current Mode" 		        (gNilanVentilationHomeKit) 			{homekit="CurrentHeaterCoolerState"

as fix - remove all “homekit” from group.
i agree, it should be more fault tolerant and it is regress compare to 3.2. with your information i will be able to fix it.

btw, filter is supported with 3.3
should look like this …

Group gNilanVentilationHomeKit			"Ventilation HomeKit"	(gNilanVentilation {homekit="HeaterCooler, Filter"}
....
Switch	filterChangeIndication   "Filter"				(gNilanVentilationHomeKit)			{homekit="FilterChangeIndication"}

Great I didn’t know filter is already supported, sorry about that!
However I’d wait until it’s possible to group the complex items - I’d like to group filter with the ventilation system (as filter is not supported by home app and grouping it with ventilation will hide it).

good news, the grouping of complex items is supported as well. exactly the use cases - accessory+battery or accessory+filter

limitations:

  • groups of the same types are not supported yet, i.e. light+light or valve+valve.
  • pretty new feature, not all combinations were tested yet.

@yfre , do you have an example of group of two complex items? I don’t think I have seen it in the documentation…

here is one, maybe not the best, but it should give an idea how it works.

in your case it should be something like

Group gNilanVentilationHomeKit			"Ventilation HomeKit"	(gNilanVentilation {homekit="HeaterCooler, Filter"}
....
Switch	filterChangeIndication   "Filter"				(gNilanVentilationHomeKit)			{homekit="FilterChangeIndication"}



1 Like

Great, it works for me without issue.
Looks like I can now finally migrate all accessaries from HomeBridge to native OpenHAB HomeKit integration, excellent work and very much appreciated! Let’s hope iOS 16 doesn’t bring more surprises :smiley:

1 Like

Hi @yfre
Sorry but I’d like to get some more help on the grouping functionality, which I’m sure something to do with the items configuration but have tried a few different ways without a solution.
I’d like to group a dimmer with a lock - it’s for controlling the car charger, the dimmer switches on/off with specific kWh and lock controls if the cable should be locked. Below is my configuration:

Group gEaseeBoxHomeKit			"EaseeBox HomeKit"	(gEaseeBox)	{homekit="Lighting,Lock"}
Dimmer EaseeBox_chargingPowerPct "EaseeBox Charging Power Pct [%d %%]" (gEaseeBoxHomeKit) {homekit="Lighting.onState,Lighting.Brightness"}
Switch Lock_cable "Cable Lock" (gEaseeBoxHomeKit) {channel="easee:mastercharger:home:EaseeCharger:config#lockCablePermanently", homekit="Lock.LockCurrentState,Lock.LockTargetState"}

Good news is I get the group appear in Home app with a dimmer and lock as required.
However the operation on any of them seem to affect the other: for example if I lock the cable it adjust dimmer to 100%, and if I turn off dimmer it unlocks the lock.
The log trace shows the following (somehow the lock features are registered on the dimmer which I think causes the problem):

2022-07-13 22:46:11.918 [TRACE] [mekit.internal.HomekitChangeListener] -  Add items gEaseeBoxHomeKit
2022-07-13 22:46:11.922 [TRACE] [mekit.internal.HomekitChangeListener] - Item gEaseeBoxHomeKit is a HomeKit accessory of types [LIGHTBULB=Empty, LOCK=Empty]. Primary type is LIGHTBULB
2022-07-13 22:46:11.922 [TRACE] [.accessories.HomekitAccessoryFactory] - Constructing gEaseeBoxHomeKit of accessory type Lighting
2022-07-13 22:46:11.923 [TRACE] [.accessories.HomekitAccessoryFactory] - Mandatory characteristics: [Item:EaseeBox_chargingPowerPct (Type=DimmerItem, State=0, Label=EaseeBox Charging Power Pct, Category=null, Groups=[gEaseeBoxHomeKit])  HomeKit type: 'Lighting' characteristic: 'OnState']
2022-07-13 22:46:11.923 [TRACE] [.accessories.HomekitAccessoryFactory] - Optional characteristics for item gEaseeBoxHomeKit: [EaseeBox_chargingPowerPct (Type=DimmerItem, State=0, Label=EaseeBox Charging Power Pct, Category=null, Groups=[gEaseeBoxHomeKit])]
2022-07-13 22:46:11.931 [TRACE] [ssories.HomekitCharacteristicFactory] - Create characteristic Item:EaseeBox_chargingPowerPct (Type=DimmerItem, State=0, Label=EaseeBox Charging Power Pct, Category=null, Groups=[gEaseeBoxHomeKit])  HomeKit type: 'Lighting' characteristic: 'Brightness'
2022-07-13 22:46:11.933 [TRACE] [.accessories.HomekitAccessoryFactory] - Constructing gEaseeBoxHomeKit of accessory type Lock
2022-07-13 22:46:11.937 [TRACE] [.accessories.HomekitAccessoryFactory] - Mandatory characteristics: [Item:EaseeBox_chargingPowerPct (Type=DimmerItem, State=0, Label=EaseeBox Charging Power Pct, Category=null, Groups=[gEaseeBoxHomeKit])  HomeKit type: 'Lighting' characteristic: 'LockCurrentState', Item:EaseeBox_chargingPowerPct (Type=DimmerItem, State=0, Label=EaseeBox Charging Power Pct, Category=null, Groups=[gEaseeBoxHomeKit])  HomeKit type: 'Lighting' characteristic: 'LockTargetState', Item:Lock_cable (Type=SwitchItem, State=ON, Label=Cable Lock, Category=null, Groups=[gEaseeBoxHomeKit])  HomeKit type: 'Lock' characteristic: 'LockCurrentState', Item:Lock_cable (Type=SwitchItem, State=ON, Label=Cable Lock, Category=null, Groups=[gEaseeBoxHomeKit])  HomeKit type: 'Lock' characteristic: 'LockTargetState']
2022-07-13 22:46:11.938 [TRACE] [.accessories.HomekitAccessoryFactory] - Optional characteristics for item gEaseeBoxHomeKit: []

I know it’s a strange combination but maybe you can spot some mistake and help me to make the accessories to work?
Many thanks :slight_smile:

interesting combination. and good to know that at least the group is visible in home app.
but i have no idea how to achieve the effect you have.

the configuration and the logs are look correct.

we need to check what home app sends to openhab.

  • as first, check te openhab event log. what kind of commands you see there
  • then, enable more logging for homekit implementation with following command in karaf
log:set TRACE io.github.hapjava

you will get a lot of logs. it is all communication between home app and openhab.
try to find the log which were added as reaction on your home app action, e.g. turn off the dimmer in home app and check the logs for that time.

Hi @yfre :
I think it has something to do with items file and creation of accessories, as the log statement below shows (if I interpret correctly) it tries to create Lock based on “Lighting accessory with Lock characteristics”. So my guess is the characteristics of the two accessories somehow get mixed up…

2022-07-13 22:46:11.933 [TRACE] [.accessories.HomekitAccessoryFactory] - Constructing gEaseeBoxHomeKit of accessory type Lock
2022-07-13 22:46:11.937 [TRACE] [.accessories.HomekitAccessoryFactory] - Mandatory characteristics: [Item:EaseeBox_chargingPowerPct (Type=DimmerItem, State=0, Label=EaseeBox Charging Power Pct, Category=null, Groups=[gEaseeBoxHomeKit])  HomeKit type: 'Lighting' characteristic: 'LockCurrentState', Item:EaseeBox_chargingPowerPct (Type=DimmerItem, State=0, Label=EaseeBox Charging Power Pct, Category=null, Groups=[gEaseeBoxHomeKit])  HomeKit type: 'Lighting' characteristic: 'LockTargetState', Item:Lock_cable (Type=SwitchItem, State=ON, Label=Cable Lock, Category=null, Groups=[gEaseeBoxHomeKit])  HomeKit type: 'Lock' characteristic: 'LockCurrentState', Item:Lock_cable (Type=SwitchItem, State=ON, Label=Cable Lock, Category=null, Groups=[gEaseeBoxHomeKit])  HomeKit type: 'Lock' characteristic: 'LockTargetState']

@somy you are right. i missed that part. it really mixing the things. good finding. need to reproduce it on my local

@somy good news, i could re-produce it on my local and if i can reproduce then i can fix it,
but probably i will have time to implement fix in the first week of August earliest.
please keep reporting any issues and missing features.

@yfre : great, thanks for looking into it! Just want to add I now combine the lock with a fan which seems to work w/o problem, so there might be something strange with lighting which caused the mix up