def getConflictingRules(self, roomName, buildingName, ruleBody): checkData(locals()) ruleBody = ruleBody.strip() from app.backend.controller.triggerManager import TriggerManager from app.backend.controller.actionManager import ActionManager triggerManager = TriggerManager() actionManager = ActionManager() room = Room(buildingName = buildingName, roomName = roomName) room.retrieve() ruleList = room.getRules( includeGroupsRules = True, includeDisabled = False) ruleAntecedent = ruleBody.split("then")[0].replace("if", "").strip() ruleConsequent = ruleBody.split("then")[1].strip() newRuleTranslatedTriggers = triggerManager.translateTrigger(ruleAntecedent) newRuleAction, originalModel, parameterValues = actionManager.getActionAndTemplateAndParameterValues(ruleConsequent) conflictingRuleList = [] for rule in ruleList: currentRuleAction, originalModel, parameterValues = actionManager.getActionAndTemplateAndParameterValues(rule.consequent) savedRuleTranslatedTriggers = triggerManager.translateTrigger(rule.antecedent) conflictingAntecedentFound = False for newRuleTrigger in newRuleTranslatedTriggers["triggers"]: for savedRuleTrigger in savedRuleTranslatedTriggers["triggers"]: if "between" not in newRuleTrigger["antecedent"]: if newRuleTrigger["antecedent"] == savedRuleTrigger["antecedent"] and (newRuleAction.category == currentRuleAction.category): conflictingAntecedentFound = True else: # In the case of range based antecedent I cannot just check if it is equal but I have to see the trigger name if newRuleTrigger["trigger"].triggerName == savedRuleTrigger["trigger"].triggerName and (newRuleAction.category == currentRuleAction.category): conflictingAntecedentFound = True if conflictingAntecedentFound: break if conflictingAntecedentFound: break if conflictingAntecedentFound: conflictingRuleList.append({"ruleId" : rule.id, "ruleBody" : rule.getFullRepresentation()}) return {"conflictingRules" : conflictingRuleList}
def executeRule(self, rule): actionManager = ActionManager() action, originalModel, parameters = actionManager.getActionAndTemplateAndParameterValues(rule.consequent) parameters.update({'buildingName' : rule.buildingName}) if rule.roomName: parameters.update({'roomName' : rule.roomName}) if rule.groupId: parameters.update({'groupId' : rule.groupId}) if self.simulationParameters: localSimulationParameters = self.simulationParameters.copy() localSimulationParameters.update({'ruleId' : rule.id, 'ruleText' : rule.getFullRepresentation()}) parameters.update({'simulationParameters' : localSimulationParameters}) driver = actionManager.getActionDriver(action, parameters) message = "Rule " + str(rule.id) + " (" + str(rule.buildingName) if rule.groupId: message += ".g[" + str(rule.groupId) + "]" if rule.roomName: message += ".r[" + str(rule.roomName) + "]" flash(message + ") actuated; consequent is '" + rule.consequent + "'...") try: driver.actuate() except Exception as e: flash(message + ") Erro while actuating the consequent '" + rule.consequent + "'... " + str(e), 'red') if not self.simulationParameters: rules = Rules() rules.setActiveRule(buildingName = rule.buildingName, roomName = rule.roomName, ruleId = rule.id)