package com.sample; import java.util.HashMap; import java.util.Map; import org.drools.KnowledgeBase; import org.drools.KnowledgeBaseConfiguration; import org.drools.KnowledgeBaseFactory; import org.drools.agent.KnowledgeAgent; import org.drools.agent.KnowledgeAgentConfiguration; import org.drools.agent.KnowledgeAgentFactory; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.conf.EventProcessingOption; import org.drools.io.ResourceChangeScannerConfiguration; import org.drools.io.ResourceFactory; import org.drools.runtime.StatefulKnowledgeSession; import org.drools.runtime.rule.FactHandle; import org.drools.runtime.rule.WorkingMemoryEntryPoint; import org.openhab.core.drools.event.RuleEvent; import org.openhab.core.drools.event.StateEvent; import org.openhab.core.items.GenericItem; import org.openhab.core.items.ItemFactory; import org.openhab.core.library.CoreItemFactory; import org.openhab.core.types.State; import org.openhab.core.types.TypeParser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class OtraPrueba { private static final String RULES_CHANGESET = "org/openhab/core/drools/changeset.xml"; static private final Logger logger = LoggerFactory.getLogger(Prueba.class); private StatefulKnowledgeSession ksession = null; private Map factHandleMap = new HashMap(); public void motor() { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newClassPathResource(RULES_CHANGESET, getClass()), ResourceType.CHANGE_SET); if(kbuilder.hasErrors()) { logger.error("There are errors in the rules: " + kbuilder.getErrors()); return; } // Habilitar el trabajo en las reglas con eventos KnowledgeBaseConfiguration kbaseConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(); kbaseConfig.setOption( EventProcessingOption.STREAM ); KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kbaseConfig); // KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); KnowledgeAgentConfiguration aconf = KnowledgeAgentFactory.newKnowledgeAgentConfiguration(); aconf.setProperty("drools.agent.newInstance", "false"); KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent("RuleAgent", kbase, aconf); kagent.applyChangeSet(ResourceFactory.newClassPathResource(RULES_CHANGESET, getClass())); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); ksession = kbase.newStatefulKnowledgeSession(); // activate notifications ResourceFactory.getResourceChangeNotifierService().start(); ResourceFactory.getResourceChangeScannerService().start(); // activate this for extensive logging // KnowledgeRuntimeLoggerFactory.newConsoleLogger(ksession); // set the scan interval to 20 secs ResourceChangeScannerConfiguration sconf = ResourceFactory.getResourceChangeScannerService().newResourceChangeScannerConfiguration(); sconf.setProperty( "drools.resource.scanner.interval", "20" ); ResourceFactory.getResourceChangeScannerService().configure(sconf); ItemFactory fac = new CoreItemFactory(); GenericItem item = fac.createItem("Number", "Temperatura"); ksession.insert(item); State state = TypeParser.parseState(item.getAcceptedDataTypes(), "1"); if(ksession!=null && item!=null) { FactHandle factHandle = factHandleMap.get(item.getName()); if(factHandle!=null) { ksession.update(factHandle, item); } ksession.insert((RuleEvent) new StateEvent(item, state)); WorkingMemoryEntryPoint entry = ksession.getWorkingMemoryEntryPoint("EvenStream"); entry.insert((RuleEvent) new StateEvent(item, state)); } // run the rule evaluation ksession.fireAllRules(); state = TypeParser.parseState(item.getAcceptedDataTypes(), "9"); if(ksession!=null && item!=null) { FactHandle factHandle = factHandleMap.get(item.getName()); if(factHandle!=null) { ksession.update(factHandle, item); } ksession.insert((RuleEvent) new StateEvent(item, state)); WorkingMemoryEntryPoint entry = ksession.getWorkingMemoryEntryPoint("EvenStream"); entry.insert((RuleEvent) new StateEvent(item, state)); } // run the rule evaluation ksession.fireAllRules(); } }