use of org.eclipse.smarthome.automation.Action in project smarthome by eclipse.
the class RuntimeRuleTest method ruleTriggeredByCompositeTrigger.
@Test
public void ruleTriggeredByCompositeTrigger() throws ItemNotFoundException, InterruptedException {
// //Test the creation of a rule out of
final Configuration triggerConfig = new Configuration(Stream.of(new SimpleEntry<>("itemName", "myMotionItem3")).collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())));
final Configuration actionConfig = new Configuration(Stream.of(new SimpleEntry<>("itemName", "myLampItem3"), new SimpleEntry<>("command", "ON")).collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())));
final Rule rule = new Rule("myRule21" + new Random().nextInt() + "_COMPOSITE");
rule.setTriggers(Arrays.asList(new Trigger[] { new Trigger("ItemStateChangeTrigger3", "core.ItemStateChangeTrigger", triggerConfig) }));
rule.setActions(Arrays.asList(new Action[] { new Action("ItemPostCommandAction3", "core.ItemCommandAction", actionConfig, null) }));
rule.setName("RuleByJAVA_API_WithCompositeTrigger");
logger.info("Rule created: {}", rule.getUID());
final RuleRegistry ruleRegistry = getService(RuleRegistry.class);
ruleRegistry.add(rule);
// Test rule
waitForAssert(() -> {
Assert.assertEquals(RuleStatus.IDLE, ruleRegistry.getStatusInfo(rule.getUID()).getStatus());
});
final Queue<Event> events = new LinkedList<>();
registerService(new EventSubscriber() {
@Override
public void receive(final Event event) {
logger.info("RuleEvent: {}", event.getTopic());
events.add(event);
}
@Override
public Set<String> getSubscribedEventTypes() {
return Collections.singleton(RuleStatusInfoEvent.TYPE);
}
@Override
public EventFilter getEventFilter() {
return null;
}
});
final EventPublisher eventPublisher = getService(EventPublisher.class);
eventPublisher.post(ItemEventFactory.createStateEvent("myPresenceItem3", OnOffType.ON));
eventPublisher.post(ItemEventFactory.createStateEvent("myMotionItem3", OnOffType.ON));
waitForAssert(() -> {
assertFalse(events.isEmpty());
RuleStatusInfoEvent event = (RuleStatusInfoEvent) events.remove();
assertEquals(RuleStatus.RUNNING, event.getStatusInfo().getStatus());
});
waitForAssert(() -> {
assertFalse(events.isEmpty());
RuleStatusInfoEvent event = (RuleStatusInfoEvent) events.remove();
assertEquals(RuleStatus.IDLE, event.getStatusInfo().getStatus());
});
}
use of org.eclipse.smarthome.automation.Action in project smarthome by eclipse.
the class RuntimeRuleTest method itemStateUpdatedBySimpleRule.
@Test
public void itemStateUpdatedBySimpleRule() throws ItemNotFoundException, InterruptedException {
final Configuration triggerConfig = new Configuration(Stream.of(new SimpleEntry<>("eventSource", "myMotionItem2"), new SimpleEntry<>("eventTopic", "smarthome/*"), new SimpleEntry<>("eventTypes", "ItemStateEvent")).collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())));
final Configuration actionConfig = new Configuration(Stream.of(new SimpleEntry<>("itemName", "myLampItem2"), new SimpleEntry<>("command", "ON")).collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())));
final Rule rule = new Rule("myRule21" + new Random().nextInt());
rule.setTriggers(Arrays.asList(new Trigger[] { new Trigger("ItemStateChangeTrigger2", "core.GenericEventTrigger", triggerConfig) }));
rule.setActions(Arrays.asList(new Action[] { new Action("ItemPostCommandAction2", "core.ItemCommandAction", actionConfig, null) }));
// I would expect the factory to create the UID of the rule and the name to be in the list of parameters.
rule.setName("RuleByJAVA_API");
logger.info("Rule created: {}", rule.getUID());
final RuleRegistry ruleRegistry = getService(RuleRegistry.class);
ruleRegistry.add(rule);
ruleRegistry.setEnabled(rule.getUID(), true);
waitForAssert(() -> {
Assert.assertEquals(RuleStatus.IDLE, ruleRegistry.getStatusInfo(rule.getUID()).getStatus());
});
// Test rule
final EventPublisher eventPublisher = getService(EventPublisher.class);
Assert.assertNotNull(eventPublisher);
eventPublisher.post(ItemEventFactory.createStateEvent("myPresenceItem2", OnOffType.ON));
final Queue<Event> events = new LinkedList<>();
registerService(new EventSubscriber() {
@Override
public void receive(final Event event) {
logger.info("Event: {}", event.getTopic());
events.add(event);
}
@Override
public Set<String> getSubscribedEventTypes() {
return Collections.singleton(ItemCommandEvent.TYPE);
}
@Override
public EventFilter getEventFilter() {
return null;
}
});
eventPublisher.post(ItemEventFactory.createStateEvent("myMotionItem2", OnOffType.ON));
waitForAssert(() -> {
assertFalse(events.isEmpty());
ItemCommandEvent event = (ItemCommandEvent) events.remove();
assertEquals("smarthome/items/myLampItem2/command", event.getTopic());
assertEquals(OnOffType.ON, event.getItemCommand());
});
}
use of org.eclipse.smarthome.automation.Action in project smarthome by eclipse.
the class CoreModuleHandlerFactory method internalCreate.
@Override
protected synchronized ModuleHandler internalCreate(final Module module, final String ruleUID) {
logger.trace("create {} -> {} : {}", module.getId(), module.getTypeUID(), ruleUID);
final String moduleTypeUID = module.getTypeUID();
if (module instanceof Trigger) {
if (GenericEventTriggerHandler.MODULE_TYPE_ID.equals(moduleTypeUID)) {
return new GenericEventTriggerHandler((Trigger) module, this.bundleContext);
} else if (ChannelEventTriggerHandler.MODULE_TYPE_ID.equals(moduleTypeUID)) {
return new ChannelEventTriggerHandler((Trigger) module, this.bundleContext);
} else if (ItemCommandTriggerHandler.MODULE_TYPE_ID.equals(moduleTypeUID)) {
return new ItemCommandTriggerHandler((Trigger) module, this.bundleContext);
} else if (ItemStateTriggerHandler.CHANGE_MODULE_TYPE_ID.equals(moduleTypeUID) || ItemStateTriggerHandler.UPDATE_MODULE_TYPE_ID.equals(moduleTypeUID)) {
return new ItemStateTriggerHandler((Trigger) module, this.bundleContext);
}
} else if (module instanceof Condition) {
// Handle conditions
if (ItemStateConditionHandler.ITEM_STATE_CONDITION.equals(moduleTypeUID)) {
ItemStateConditionHandler handler = new ItemStateConditionHandler((Condition) module);
handler.setItemRegistry(itemRegistry);
return handler;
} else if (GenericEventConditionHandler.MODULETYPE_ID.equals(moduleTypeUID)) {
return new GenericEventConditionHandler((Condition) module);
} else if (CompareConditionHandler.MODULE_TYPE.equals(moduleTypeUID)) {
return new CompareConditionHandler((Condition) module);
}
} else if (module instanceof Action) {
if (ItemCommandActionHandler.ITEM_COMMAND_ACTION.equals(moduleTypeUID)) {
final ItemCommandActionHandler postCommandActionHandler = new ItemCommandActionHandler((Action) module);
postCommandActionHandler.setEventPublisher(eventPublisher);
postCommandActionHandler.setItemRegistry(itemRegistry);
return postCommandActionHandler;
} else if (RuleEnablementActionHandler.UID.equals(moduleTypeUID)) {
return new RuleEnablementActionHandler((Action) module, ruleRegistry);
} else if (RunRuleActionHandler.UID.equals(moduleTypeUID)) {
return new RunRuleActionHandler((Action) module, ruleRegistry);
}
}
logger.error("The ModuleHandler is not supported:{}", moduleTypeUID);
return null;
}
use of org.eclipse.smarthome.automation.Action in project smarthome by eclipse.
the class ModuleTypeResourceBundleProvider method createLocalizedActionType.
/**
* Utility method for localization of ActionTypes.
*
* @param at is an ActionType for localization.
* @param bundle the bundle providing localization resources.
* @param moduleTypeUID is an ActionType uid.
* @param locale represents a specific geographical, political, or cultural region.
* @param lconfigDescriptions are ActionType localized config descriptions.
* @param llabel is an ActionType localized label.
* @param ldescription is an ActionType localized description.
* @return localized ActionType.
*/
private ActionType createLocalizedActionType(ActionType at, Bundle bundle, String moduleTypeUID, Locale locale, List<ConfigDescriptionParameter> lconfigDescriptions, String llabel, String ldescription) {
List<Input> inputs = ModuleTypeI18nUtil.getLocalizedInputs(i18nProvider, at.getInputs(), bundle, moduleTypeUID, locale);
List<Output> outputs = ModuleTypeI18nUtil.getLocalizedOutputs(i18nProvider, at.getOutputs(), bundle, moduleTypeUID, locale);
ActionType lat = null;
if (at instanceof CompositeActionType) {
List<Action> modules = ModuleI18nUtil.getLocalizedModules(i18nProvider, ((CompositeActionType) at).getChildren(), bundle, moduleTypeUID, ModuleTypeI18nUtil.MODULE_TYPE, locale);
lat = new CompositeActionType(moduleTypeUID, lconfigDescriptions, llabel, ldescription, at.getTags(), at.getVisibility(), inputs, outputs, modules);
} else {
lat = new ActionType(moduleTypeUID, lconfigDescriptions, llabel, ldescription, at.getTags(), at.getVisibility(), inputs, outputs);
}
return lat;
}
use of org.eclipse.smarthome.automation.Action in project smarthome by eclipse.
the class TemplateResourceBundleProvider method getPerLocale.
/**
* This method is used to localize the {@link Template}s.
*
* @param element is the {@link Template} that must be localized.
* @param locale represents a specific geographical, political, or cultural region.
* @return the localized {@link Template}.
*/
private RuleTemplate getPerLocale(RuleTemplate defTemplate, Locale locale) {
if (locale == null || defTemplate == null || i18nProvider == null) {
return defTemplate;
}
String uid = defTemplate.getUID();
Bundle bundle = getBundle(uid);
if (defTemplate instanceof RuleTemplate) {
String llabel = RuleTemplateI18nUtil.getLocalizedRuleTemplateLabel(i18nProvider, bundle, uid, defTemplate.getLabel(), locale);
String ldescription = RuleTemplateI18nUtil.getLocalizedRuleTemplateDescription(i18nProvider, bundle, uid, defTemplate.getDescription(), locale);
List<ConfigDescriptionParameter> lconfigDescriptions = getLocalizedConfigurationDescription(i18nProvider, defTemplate.getConfigurationDescriptions(), bundle, uid, RuleTemplateI18nUtil.RULE_TEMPLATE, locale);
List<Action> lactions = ModuleI18nUtil.getLocalizedModules(i18nProvider, defTemplate.getActions(), bundle, uid, RuleTemplateI18nUtil.RULE_TEMPLATE, locale);
List<Condition> lconditions = ModuleI18nUtil.getLocalizedModules(i18nProvider, defTemplate.getConditions(), bundle, uid, RuleTemplateI18nUtil.RULE_TEMPLATE, locale);
List<Trigger> ltriggers = ModuleI18nUtil.getLocalizedModules(i18nProvider, defTemplate.getTriggers(), bundle, uid, RuleTemplateI18nUtil.RULE_TEMPLATE, locale);
return new RuleTemplate(uid, llabel, ldescription, defTemplate.getTags(), ltriggers, lconditions, lactions, lconfigDescriptions, defTemplate.getVisibility());
}
return null;
}
Aggregations