diff --git a/src/main/java/org/openhab/automation/jrule/internal/JRuleFactory.java b/src/main/java/org/openhab/automation/jrule/internal/JRuleFactory.java index 2811732d..deccf8d2 100644 --- a/src/main/java/org/openhab/automation/jrule/internal/JRuleFactory.java +++ b/src/main/java/org/openhab/automation/jrule/internal/JRuleFactory.java @@ -31,6 +31,7 @@ import org.openhab.core.scheduler.CronScheduler; import org.openhab.core.thing.ThingManager; import org.openhab.core.thing.ThingRegistry; +import org.openhab.core.thing.link.ItemChannelLinkRegistry; import org.openhab.core.voice.VoiceManager; import org.osgi.framework.FrameworkUtil; import org.osgi.service.component.ComponentContext; @@ -62,9 +63,11 @@ public class JRuleFactory { @Activate public JRuleFactory(Map properties, final @Reference JRuleEventSubscriber eventSubscriber, - final @Reference ItemRegistry itemRegistry, final @Reference ThingRegistry thingRegistry, - final @Reference ThingManager thingManager, final @Reference EventPublisher eventPublisher, - final @Reference VoiceManager voiceManager, final @Reference AudioHTTPServer audioHTTPServer, + final @Reference ItemRegistry itemRegistry, + final @Reference ItemChannelLinkRegistry itemChannelLinkRegistry, + final @Reference ThingRegistry thingRegistry, final @Reference ThingManager thingManager, + final @Reference EventPublisher eventPublisher, final @Reference VoiceManager voiceManager, + final @Reference AudioHTTPServer audioHTTPServer, final @Reference NetworkAddressService networkAddressService, final ComponentContext componentContext, final @Reference CronScheduler cronScheduler, final @Reference MetadataRegistry metadataRegistry, final @Reference JRuleRuleProvider ruleProvider, @@ -80,8 +83,8 @@ public JRuleFactory(Map properties, final @Reference JRuleEventS jRuleEngine.initialize(); JRuleItemRegistry.setMetadataRegistry(metadataRegistry); - jRuleHandler = new JRuleHandler(config, itemRegistry, thingRegistry, thingManager, eventPublisher, - eventSubscriber, voiceManager, audioHTTPServer, networkAddressService, cronScheduler, + jRuleHandler = new JRuleHandler(config, itemRegistry, itemChannelLinkRegistry, thingRegistry, thingManager, + eventPublisher, eventSubscriber, voiceManager, audioHTTPServer, networkAddressService, cronScheduler, componentContext.getBundleContext(), metadataRegistry); delayedInit.call(this::init); } diff --git a/src/main/java/org/openhab/automation/jrule/internal/handler/JRuleHandler.java b/src/main/java/org/openhab/automation/jrule/internal/handler/JRuleHandler.java index 03db92fa..e09ff78b 100644 --- a/src/main/java/org/openhab/automation/jrule/internal/handler/JRuleHandler.java +++ b/src/main/java/org/openhab/automation/jrule/internal/handler/JRuleHandler.java @@ -70,6 +70,7 @@ import org.openhab.core.thing.events.ThingAddedEvent; import org.openhab.core.thing.events.ThingRemovedEvent; import org.openhab.core.thing.events.ThingUpdatedEvent; +import org.openhab.core.thing.link.ItemChannelLinkRegistry; import org.openhab.core.voice.VoiceManager; import org.osgi.framework.BundleContext; import org.slf4j.Logger; @@ -89,6 +90,9 @@ public class JRuleHandler implements PropertyChangeListener { @NonNullByDefault({}) private final ItemRegistry itemRegistry; + @NonNullByDefault({}) + private final ItemChannelLinkRegistry itemChannelLinkRegistry; + @NonNullByDefault({}) private final ThingRegistry thingRegistry; @@ -119,11 +123,13 @@ public class JRuleHandler implements PropertyChangeListener { private final JRuleDelayedDebouncingExecutor delayedRulesReloader; private final JRuleDelayedDebouncingExecutor delayedItemsCompiler; - public JRuleHandler(JRuleConfig config, ItemRegistry itemRegistry, ThingRegistry thingRegistry, - ThingManager thingManager, EventPublisher eventPublisher, JRuleEventSubscriber eventSubscriber, - VoiceManager voiceManager, AudioHTTPServer audioHTTPServer, NetworkAddressService networkAddressService, - CronScheduler cronScheduler, BundleContext bundleContext, MetadataRegistry metadataRegistry) { + public JRuleHandler(JRuleConfig config, ItemRegistry itemRegistry, ItemChannelLinkRegistry itemChannelLinkRegistry, + ThingRegistry thingRegistry, ThingManager thingManager, EventPublisher eventPublisher, + JRuleEventSubscriber eventSubscriber, VoiceManager voiceManager, AudioHTTPServer audioHTTPServer, + NetworkAddressService networkAddressService, CronScheduler cronScheduler, BundleContext bundleContext, + MetadataRegistry metadataRegistry) { this.itemRegistry = itemRegistry; + this.itemChannelLinkRegistry = itemChannelLinkRegistry; this.thingRegistry = thingRegistry; this.metadataRegistry = metadataRegistry; this.eventSubscriber = eventSubscriber; @@ -155,7 +161,7 @@ public JRuleHandler(JRuleConfig config, ItemRegistry itemRegistry, ThingRegistry final JRuleItemHandler itemHandler = JRuleItemHandler.get(); itemHandler.setItemRegistry(itemRegistry); - + itemHandler.setItemChannelLinkRegistry(itemChannelLinkRegistry); logDebug("JRuleHandler()"); } diff --git a/src/main/java/org/openhab/automation/jrule/internal/handler/JRuleItemHandler.java b/src/main/java/org/openhab/automation/jrule/internal/handler/JRuleItemHandler.java index df8cbda3..3b22b6d6 100644 --- a/src/main/java/org/openhab/automation/jrule/internal/handler/JRuleItemHandler.java +++ b/src/main/java/org/openhab/automation/jrule/internal/handler/JRuleItemHandler.java @@ -14,12 +14,18 @@ import java.util.Arrays; +import org.openhab.core.items.GroupItem; import org.openhab.core.items.Item; import org.openhab.core.items.ItemRegistry; import org.openhab.core.library.items.NumberItem; import org.openhab.core.library.items.StringItem; +import org.openhab.core.library.items.SwitchItem; import org.openhab.core.library.types.DecimalType; +import org.openhab.core.library.types.OnOffType; import org.openhab.core.library.types.StringType; +import org.openhab.core.thing.ChannelUID; +import org.openhab.core.thing.link.ItemChannelLink; +import org.openhab.core.thing.link.ItemChannelLinkRegistry; /** * The {@link JRuleItemHandler} provides access to item Registry @@ -34,11 +40,16 @@ private JRuleItemHandler() { } private ItemRegistry itemRegistry; + private ItemChannelLinkRegistry itemChannelLinkRegistry; public void setItemRegistry(ItemRegistry itemRegistry) { this.itemRegistry = itemRegistry; } + public void setItemChannelLinkRegistry(ItemChannelLinkRegistry itemChannelLinkRegistry) { + this.itemChannelLinkRegistry = itemChannelLinkRegistry; + } + public static JRuleItemHandler get() { if (instance == null) { synchronized (JRuleItemHandler.class) { @@ -58,6 +69,18 @@ public boolean itemRegistryContainsItem(String itemName) { return itemRegistry.get(itemName) != null; } + public Item addSwitchItem(String name) { + return addSwitchItem(name, null, null, null); + } + + public Item addSwitchItem(String name, Boolean value) { + return addSwitchItem(name, value, null, null); + } + + public Item addSwitchItem(String name, Boolean value, String label) { + return addSwitchItem(name, value, label, null); + } + public Item addNumberItem(String name) { return addNumberItem(name, null, null, null); } @@ -96,6 +119,30 @@ public Item addStringItem(String name, String value, String label) { return addStringItem(name, value, label, null); } + public Item addSwitchItem(String name, Boolean value, String label, String[] groupNames) { + final SwitchItem switchItem = new SwitchItem(name); + if (value != null) { + switchItem.setState(OnOffType.from(value)); + } + if (label != null) { + switchItem.setLabel(label); + } + if (groupNames != null && groupNames.length > 0) { + Arrays.stream(groupNames).forEach(g -> switchItem.addGroupName(g)); + } + return itemRegistry.add(switchItem); + } + + public GroupItem addGroupItem(String name, String label) { + GroupItem groupItem = new GroupItem(name); + groupItem.setLabel(label); + return (GroupItem) itemRegistry.add(groupItem); + } + + public void removeItem(String name) { + itemRegistry.remove(name, true); + } + public Item addStringItem(String name, String value, String label, String[] groupNames) { final StringItem stringItem = new StringItem(name); if (value != null) { @@ -109,4 +156,9 @@ public Item addStringItem(String name, String value, String label, String[] grou } return itemRegistry.add(stringItem); } + + public void linkItemWithChannel(String itemName, ChannelUID uid) { + ItemChannelLink link = new ItemChannelLink(itemName, uid); + itemChannelLinkRegistry.add(link); + } }