Errors after start of OH service (org.openhab.core.semantics.internal.SemanticsMetadataProvider)

Hi everyone,
before I switch to OH 4.0, I would like to clear all the errors in the log. After starting the OH service (and only after starting), I see several errors similar to the ones below. I have already checked that I do not have items in more than one semantically tagged groups, which was the case, but even after deleting the tags, the errors remain the same.

Can you please advise how to find the root cause of these errors?

  • Platform information:
    • Hardware: Raspberry Pi 4
    • OS: openHABian (bullseye)
    • Java Runtime Environment: 11
    • openHAB version: 3.4.5
2023-08-27 20:23:42.124 [ERROR] [ore.common.registry.AbstractRegistry] - Cannot inform the listener "org.openhab.core.semantics.internal.SemanticsMetadataProvider@17ea607" about the "ADDED" event: null
java.lang.NullPointerException: null
	at java.util.TreeMap.getEntry(TreeMap.java:345) ~[?:?]
	at java.util.TreeMap.get(TreeMap.java:277) ~[?:?]
	at org.openhab.core.semantics.SemanticTags.getById(SemanticTags.java:65) ~[?:?]
	at org.openhab.core.semantics.SemanticTags.getSemanticType(SemanticTags.java:115) ~[?:?]
	at org.openhab.core.semantics.internal.SemanticsMetadataProvider.processItem(SemanticsMetadataProvider.java:110) ~[?:?]
	at org.openhab.core.semantics.internal.SemanticsMetadataProvider.processItem(SemanticsMetadataProvider.java:130) ~[?:?]
	at org.openhab.core.semantics.internal.SemanticsMetadataProvider.added(SemanticsMetadataProvider.java:252) ~[?:?]
	at org.openhab.core.semantics.internal.SemanticsMetadataProvider.added(SemanticsMetadataProvider.java:1) ~[?:?]
	at org.openhab.core.common.registry.AbstractRegistry.notifyListeners(AbstractRegistry.java:367) ~[?:?]
	at org.openhab.core.common.registry.AbstractRegistry.notifyListenersAboutAddedElement(AbstractRegistry.java:400) ~[?:?]
	at org.openhab.core.internal.items.ItemRegistryImpl.notifyListenersAboutAddedElement(ItemRegistryImpl.java:379) ~[?:?]
	at org.openhab.core.internal.items.ItemRegistryImpl.notifyListenersAboutAddedElement(ItemRegistryImpl.java:1) ~[?:?]
	at java.lang.Iterable.forEach(Iterable.java:75) ~[?:?]
	at org.openhab.core.common.registry.AbstractRegistry.addProvider(AbstractRegistry.java:432) ~[?:?]
	at org.openhab.core.internal.items.ItemRegistryImpl.addProvider(ItemRegistryImpl.java:410) ~[?:?]
	at org.openhab.core.common.registry.AbstractRegistry$ProviderTracker.addingService(AbstractRegistry.java:149) ~[?:?]
	at org.openhab.core.common.registry.AbstractRegistry$ProviderTracker.addingService(AbstractRegistry.java:1) ~[?:?]
	at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:943) ~[osgi.core-7.0.0.jar:?]
	at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:871) ~[osgi.core-7.0.0.jar:?]
	at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256) ~[osgi.core-7.0.0.jar:?]
	at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229) ~[osgi.core-7.0.0.jar:?]
	at org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:903) ~[osgi.core-7.0.0.jar:?]
	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.register(ServiceRegistrationImpl.java:141) ~[org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.registerService(ServiceRegistry.java:261) ~[org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:495) ~[org.eclipse.osgi-3.17.200.jar:?]
	at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:929) ~[?:?]
	at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:915) ~[?:?]
	at org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(RegistrationManager.java:133) ~[?:?]
	at org.apache.felix.scr.impl.manager.AbstractComponentManager.registerService(AbstractComponentManager.java:984) ~[?:?]
	at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:752) ~[?:?]
	at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.addedService(DependencyManager.java:1271) ~[?:?]
	at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.addedService(DependencyManager.java:1222) ~[?:?]
	at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerAdded(ServiceTracker.java:1200) ~[?:?]
	at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerAdded(ServiceTracker.java:1121) ~[?:?]
	at org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.trackAdding(ServiceTracker.java:928) ~[?:?]
	at org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.track(ServiceTracker.java:864) ~[?:?]
	at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:1152) ~[?:?]
	at org.apache.felix.scr.impl.BundleComponentActivator$ListenerInfo.serviceChanged(BundleComponentActivator.java:114) ~[?:?]
	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.register(ServiceRegistrationImpl.java:141) ~[org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.registerService(ServiceRegistry.java:261) ~[org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:495) ~[org.eclipse.osgi-3.17.200.jar:?]
	at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:929) ~[?:?]
	at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:915) ~[?:?]
	at org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(RegistrationManager.java:133) ~[?:?]
	at org.apache.felix.scr.impl.manager.AbstractComponentManager.registerService(AbstractComponentManager.java:984) ~[?:?]
	at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:752) ~[?:?]
	at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.addedService(DependencyManager.java:1271) ~[?:?]
	at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.addedService(DependencyManager.java:1222) ~[?:?]
	at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerAdded(ServiceTracker.java:1200) ~[?:?]
	at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerAdded(ServiceTracker.java:1121) ~[?:?]
	at org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.trackAdding(ServiceTracker.java:928) ~[?:?]
	at org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.track(ServiceTracker.java:864) ~[?:?]
	at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:1152) ~[?:?]
	at org.apache.felix.scr.impl.BundleComponentActivator$ListenerInfo.serviceChanged(BundleComponentActivator.java:114) ~[?:?]
	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.register(ServiceRegistrationImpl.java:141) ~[org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.registerService(ServiceRegistry.java:261) ~[org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:495) ~[org.eclipse.osgi-3.17.200.jar:?]
	at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:929) ~[?:?]
	at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:915) ~[?:?]
	at org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(RegistrationManager.java:133) ~[?:?]
	at org.apache.felix.scr.impl.manager.AbstractComponentManager.registerService(AbstractComponentManager.java:984) ~[?:?]
	at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:752) ~[?:?]
	at org.apache.felix.scr.impl.manager.AbstractComponentManager.enableInternal(AbstractComponentManager.java:674) ~[?:?]
	at org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:437) ~[?:?]
	at org.apache.felix.scr.impl.manager.ConfigurableComponentHolder.enableComponents(ConfigurableComponentHolder.java:667) ~[?:?]
	at org.apache.felix.scr.impl.BundleComponentActivator.initialEnable(BundleComponentActivator.java:305) ~[?:?]
	at org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:554) ~[?:?]
	at org.apache.felix.scr.impl.Activator.access$200(Activator.java:70) ~[?:?]
	at org.apache.felix.scr.impl.Activator$ScrExtension.start(Activator.java:421) ~[?:?]
	at org.apache.felix.scr.impl.AbstractExtender.createExtension(AbstractExtender.java:196) ~[?:?]
	at org.apache.felix.scr.impl.AbstractExtender.modifiedBundle(AbstractExtender.java:169) ~[?:?]
	at org.apache.felix.scr.impl.AbstractExtender.modifiedBundle(AbstractExtender.java:49) ~[?:?]
	at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:488) ~[osgi.core-7.0.0.jar:?]
	at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:420) ~[osgi.core-7.0.0.jar:?]
	at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:232) ~[osgi.core-7.0.0.jar:?]
	at org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:450) ~[osgi.core-7.0.0.jar:?]
	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.start(Module.java:486) ~[org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:445) ~[org.eclipse.osgi-3.17.200.jar:?]
	at org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:464) ~[org.eclipse.osgi-3.17.200.jar:?]
	at org.apache.karaf.features.internal.service.BundleInstallSupportImpl.startBundle(BundleInstallSupportImpl.java:165) ~[?:?]
	at org.apache.karaf.features.internal.service.FeaturesServiceImpl.startBundle(FeaturesServiceImpl.java:1160) ~[?:?]
	at org.apache.karaf.features.internal.service.Deployer.deploy(Deployer.java:1041) ~[?:?]
	at org.apache.karaf.features.internal.service.FeaturesServiceImpl.doProvision(FeaturesServiceImpl.java:1069) ~[?:?]
	at org.apache.karaf.features.internal.service.FeaturesServiceImpl.lambda$doProvisionInThread$13(FeaturesServiceImpl.java:1004) ~[?:?]
	at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
	at java.lang.Thread.run(Thread.java:829) [?:?]

Could you kindly provide me with some guidance on where to investigate? I have thoroughly reviewed all my items manually, checking for loops and dead channel links, but I couldn’t identify any issues. At this point, my only option seems to be rebuilding the entire model from scratch, which involves a considerable amount of work. I appreciate your assistance.
Thank you.

I’ve not seen this exact error before, but it seems to me that there still must be something wrong with the structure of your model. When the system tries to convert your model tags to the semantic metadata somewhere there is a null value (you are missing a required tag).

Did you use the UI to create your model or did you try to do this with .item files?

Thank you for your prompt response.
All items have been created through the UI. Some items are associated with multiple groups, yet only one of these groups - typically the room group - is semantically tagged.

Would it be helpful if I uploaded items from the API Explorer for reference? Additionally, is there a method to identify a potentially faulty item? I attempted to adjust the log level without success.

This might be your problem. If all of your points are directly in locations and not in equipment that may be causing the metadata to fail. The way the model is expected to be used there are only a very few situations a point is a direct member of a location (for a location temperature) but these situations are actually exceptions to the only one sentence group rule because they are still expected to be part of a equipment group as well.

A good rule of thumb is that more information is always helpful when asking questions here. It is easier for us to ignore extra information than guess at missing information.

The typical room model is illustrated in the image below. Are you recommending that all lights should be grouped under the ‘Lights’ equipment, all blinds under ‘Blinds’ equipment, and so forth?

For instance, blinds are associated with a specific location/room, but they also belong to the non-semantic group ‘All Blinds,’ which is within the ‘Home’ location.

I have attached all items for your reference:
items.txt (88.5 KB)

The nest thermostat is correctly configured, Within the room group you have an equipment group and within the equipment group you have all the point items associated with that piece of equipment. All the other parts of the semantic model should follow this pattern as well.

They should not necessarily be under the same group. Each light item point should be within a light equipment that accurately reflects the physical structure of the room. All of those point items that are just in a room but not within some equipment are causing your problem.

Here’s one of my rooms:
image

Even devices that have only one associated point have that point within an equipment group. Every semantic point must be within some semantic equipment group.

The semantic model is not about organizing your entire OH system. The semantic model is for adding structurally relevant information to the parts of your OH system that users are expected to interact with. Before you add something to the semantic model ask yourself, “Would on of the users of my smart home ever need to directly interact with this item?” If the answer is no then include the item in whatever non-semantic organization you have for the functioning of your system, but leave it out of the model. Anything in the model however, has to follow the correct structure where every point item must be a part of one and only one equipment group and every equipment group must be in one and only one location group and every location group may be a member of one and only one other location group.

1 Like

Okay, I definitely overlooked that aspect. The rest is clear and should be ok in my model.
Thank you very much for pointing it out. I will rearrange the model accordingly and will inform you once the adjustments are complete. It will take some time :smiley:

I’ve redefined the model, ensuring that all points are now within their respective equipment groups. However, I’m still encountering the same errors after restarting OpenHAB. Could it be possible for one equipment group to contain more than one point with the same class and property, or is that also prohibited?

Thank you :slight_smile:

image

OK strange. There must still be an item somewhere that has an improper semantic configuration.

The semantic model is built entirely from these groups and the series of semantic tags. However, for ease of use in rules and widgets, there is an additional piece, the semantic metadata. For example, a you define the equipment Blinds in the Bathroom location just by putting blinds in the Bathroom location group and giving some equipment level semantic tag. You don’t set the semantic metadata, but when that equipment is created (or loaded on restart which is the same thing), OH reads the semantic structure and automatically creates the semantic metadata, in this case it would add the semantic property hasLocation to the metadata with the value of the name of the Bathroom group item. You can see these properties when you view any of the semantic model items in the items detail page. Here’s my garage door as one random example:

My interpretation of the error that you are getting is that at some point during the process of creating the semantic metadata from your configured items, the conversion attempts to set some required metadata to a null value meaning that a semantic tag that it expects to find on an item at that level of the model just isn’t there.

We can rule out the problem being trying to set the isPointOf metadata which is where the equipment of a point is listed because you now have all your points in equipment, But something somewhere is still missing. Maybe you have a non-semantic item in one of the semantic groups (which then wouldn’t show up on the model tree unless you clicked on “Show non-semantic” (and even then I’m not sure if it would show), maybe you still have an item where you accidentally deleted one of the semantic tags. Maybe you have added a reserved semantic tag to an item that isn’t part of the model otherwise.

To my knowledge there is no automated tool for validating a semantic configuration, so unfortunately if you are going to find the error(s) it is still a manual process (although making a feature request for such a validation tool sounds like a good idea).

Creating the model can be a pretty quick process with the tools that are available however. If it were me, at this point I might just count it easier to start the model over, Of course, if the issue is some other item that shouldn’t be in the model with some errant semantic data on it, then even that wouldn’t help so maybe that not the best approach yet.

That shouldn’t be a problem at all. There are many legitimate reason why an equipment might have multiple of the same type of point. For example my seedling table and heating mats are all plugged into outlets in the same smart surge protector, so that surge prtoector equipment has 6 of the same Switch (Power) points, one for each outlet.

I do have such items, and from my understanding, it is acceptable to include non-semantic items in the model - after all, why would the option to ‘Show non-semantic’ exist otherwise? I am considering removing the group membership from all non-semantic items, as it doesn’t serve a functional purpose and is primarily for clarity.

image

The more we discuss it, the more I am inclined to thinking about the same.

There you go. Those are also causing this problem.

I do not believe so. Every item inside a semantically tagged group must itself also have semantic tags if you are going to avoid errors with the semantic metadata. The option to show non-semantic items exists for several reasons, including that this semantic tree display is used in other areas of the UI including item selection dialog boxes where you need to be able to select both semantic and non-semantic items. For me, the model window is a primary interface for much item management (although it grows less important as other pages of the UI mature) and often I am working on something with the model and need to adjust a non-semantic item as well, so showing those in addition is very expedient. It does not imply that you should mix non-semantic items into your model.

I believe that would fix your problem. See my previous comment:

Now it seems to me that this drastic solution is not required. Your non-semantic items in the model are quite clearly the issue.

You do have another option, I think: ignore the error completely. You now know what the source of the error is and it does not appear that the error freezes correct completion of the model or in any other way hinders OH function. Essentially it just means that those items do not get proper semantic metadata but since you do not consider them semantic anyway that isn’t a big issue. If it is really important to you to keep those non-semantic items in the model then there’s nothing to stop you. Personally I feel there are probably better solutions to whatever benefit you gain from having those items there, but if it works for you then you can consider keeping it.

Thank you sincerely for the considerable effort you’ve put into this.

Regrettably, even after removing all non-semantic items from the model, the errors persist.
What a journey… :smiley:

Considering the challenges, I might opt for starting from scratch. The reason behind this investigation is my inability to upgrade to OH 4.x. Despite this hurdle, the entire smart home has been functioning flawlessly for over two years, with seamless integration of all lighting, outlets, blinds, and even the Heat Recovery Unit and HVAC.

Thanks to this discussion, I now have a clearer understanding of what to avoid in the future.

I revisited the model and items and found some mistakes.

The first issue was a null tag in a non-semantic item (I have no idea why it is there):

    "tags": [
      null,
      "Blinds_auto"
    ],

The second issue was a mix of equipment and point tags on some items (probably due to some typos when I created the model in batches with the API explorer):

    "tags": [
      "Control",
      "Opening",
      "Blinds"
    ]

Now, there are no errors at the start of the service - thank you once again for all the effort.

However, now that all semantic items have an equipment group, I do not understand one thing - the purpose of the property tab in the UI. For example, I have lights in both the Equipment and Property tabs. I will probably just hide the one in the Equipment tab, but I would like to understand the intention behind this.

If your system still follows the structure of the screen shot a few answers up, then the similarity of these two tabs is because you still haven’t quite followed the full expectation of the semantic configuration. Equipment groups are still intended to be digital representations of a single actual device, not an aggregate of all similar devices in a space. If you look at my example further up you will see that in my living room, I have two Switch (light) points, but instead of combining them into one Light equipment, they are separated into two different groups because they represent two different physical devices, one which controls a lamp, and one which controls an overhead light.

The semantic model is a way for various parts of OH to understand in more human terms the relationships of various aspects of your smart home. It is not used by every aspect of the software, but the overview page tabs use it, HABbot uses it (if you have that installed) and some user project such as the new semanticHomeMenu use it.

HABbot which is a basic natural language interface, is a good example, then, of why that extra separation of equipment makes sense. I can ask HABbot to turn on the lights in the living room, in which case it finds all Switch (light) points and sends an ON command. But what if I’m only interested in having the lamp turn on? If all the Switch (light) points are gathered into one equipment group there is no way for HABbot to know that the various switch items are different.

You intuitively want to gather all the similar equipment point into a single equipment group, but you don’t have to do that (and in fact, you loose some semantic information when you do). As you can see by the fact that separate equipment and property tabs exist, the system is still capable of making that logical group of properties even when they come from different equipment.

It may feel like overkill to have three different Lightbulb equipment groups in a location that has three different smart bulbs, but all those extra groups are the whole point. The model is about adding information, each of those groups is another bit of that information. When making the model it is best to think about the actual physical nature of your setup. Are all three blinds in your living room controlled by the same single piece of hardware (equipment)? No? Then they shouldn’t be in the same equipment group they should be in separate groups. Are the corridor leds the exact same piece of hardware as the tv shelf light? Seems unlikely to me, they should be modeled as different equipment in the same location. Nearly identical equipment yes, but still actual individual pieces of equipment.