Ejemplo n.º 1
0
	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}
Ejemplo n.º 2
0
	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)