Example #1
0
def editGroupInBuilding(username=None, buildingName=None, groupId=None):
    if request.method == "POST":

        sessionKey = validateInput(request.form["sessionKey"])
        userUuid = validateInput(request.form["userUuid"])
        description = validateInput(request.form["description"])
        crossRoomsValidation = (
            validateInput(request.form["crossRoomsValidation"])
            if "crossRoomsValidation" in request.form.keys()
            else False
        )  # BOOLEAN VALUE
        crossRoomsValidationCategories = (
            validateInput(request.form["crossRoomsValidationCategories"])
            if "crossRoomsValidationCategories" in request.form.keys()
            else None
        )  # LIST IN JSON FORMAT

        try:
            session = SessionManager()
            session.checkSessionValidity(sessionKey, userUuid)
            buildingsManager = BuildingsManager()

            return returnResult(
                buildingsManager.editGroup(
                    groupId=groupId,
                    buildingName=buildingName,
                    description=description,
                    crossRoomsValidation=crossRoomsValidation,
                    crossRoomsValidationCategories=crossRoomsValidationCategories,
                )
            )
        except Exception as e:
            return returnError(e)
Example #2
0
def addRuleToGroup(username=None, buildingName=None, groupId=None):
    if request.method == "POST":

        sessionKey = validateInput(request.form["sessionKey"])
        userUuid = validateInput(request.form["userUuid"])

        priority = validateInput(request.form["priority"])
        ruleBody = validateInput(request.form["ruleBody"])

        authorUuid = userUuid

        try:
            session = SessionManager()
            session.checkSessionValidity(sessionKey, userUuid)
            buildingsManager = BuildingsManager()
            buildingsManager.checkUserBinding(buildingName, username)
            groupsManager = GroupsManager()

            return returnResult(
                groupsManager.addRule(
                    priority=priority,
                    buildingName=buildingName,
                    groupId=groupId,
                    authorUuid=authorUuid,
                    ruleBody=ruleBody,
                )
            )
        except Exception as e:
            return returnError(e)
Example #3
0
def editRuleInRoom(username=None, buildingName=None, roomName=None, ruleId=None):
    if request.method == "POST":

        sessionKey = validateInput(request.form["sessionKey"])
        userUuid = validateInput(request.form["userUuid"])

        priority = validateInput(request.form["priority"])
        ruleBody = validateInput(request.form["ruleBody"])

        groupId = request.form["groupId"] if "groupId" in request.form.keys() else None

        # authorUuid = userUuid
        editorUuid = userUuid

        try:
            session = SessionManager()
            session.checkSessionValidity(sessionKey, userUuid)
            buildingsManager = BuildingsManager()
            buildingsManager.checkUserBinding(buildingName, username)
            roomsManager = RoomsManager()

            return returnResult(
                roomsManager.editRule(
                    ruleId=ruleId,
                    priority=priority,
                    buildingName=buildingName,
                    roomName=roomName,
                    editorUuid=userUuid,
                    ruleBody=ruleBody,
                    groupId=groupId,
                )
            )
        except Exception as e:
            return returnError(e)
Example #4
0
def roomSimulation(username=None, buildingName=None, roomName=None):
    if request.method == "POST":

        sessionKey = validateInput(request.form["sessionKey"])
        userUuid = validateInput(request.form["userUuid"])
        occupancyTimeRangeFrom = validateInput(request.form["occupancyTimeRangeFrom"])
        occupancyTimeRangeTo = validateInput(request.form["occupancyTimeRangeTo"])
        roomTemperature = validateInput(request.form["roomTemperature"])
        externalTemperature = validateInput(request.form["externalTemperature"])
        weather = validateInput(request.form["weather"])

        try:
            session = SessionManager()
            session.checkSessionValidity(sessionKey, userUuid)
            buildingsManager = BuildingsManager()
            buildingsManager.checkUserBinding(buildingName, username)
            roomSimulator = RoomSimulator(
                buildingName=buildingName,
                roomName=roomName,
                occupancyTimeRangeFrom=occupancyTimeRangeFrom,
                occupancyTimeRangeTo=occupancyTimeRangeTo,
                roomTemperature=roomTemperature,
                externalTemperature=externalTemperature,
                weather=weather,
            )

            return returnResult(roomSimulator.start())
        except Exception as e:
            return returnError(e)
	def start(self):

		buildingsManager = BuildingsManager()

		days = []
		startDate = datetime.strptime(self.startDate, '%Y-%m-%d')
		for i in range(0, self.numberOfDays):
			days.append( (startDate + timedelta(days=i)).strftime("%Y-%m-%d"))


		for room in buildingsManager.getRooms(self.buildingName)["rooms"]:

			roomName = room["roomName"]

			if self.roomFilter:
				if not roomName in self.roomFilter:
					continue

			simulationResult = {}
			for day in days:

				roomSimulator = RoomSimulator(buildingName = self.buildingName, roomName = roomName, currentDate = day)
				simulationResult[day] = roomSimulator.start()

			if not os.path.exists("tools/simulation/results/"): os.makedirs("tools/simulation/results/")
			out_file = open("tools/simulation/results/" + roomName + ".json","w")
			out_file.write(json.dumps(simulationResult, separators=(',', ':')))
			out_file.close()
Example #6
0
def roomRules(username=None, buildingName=None, roomName=None):

    if request.method == "POST":

        sessionKey = validateInput(request.form["sessionKey"])
        userUuid = validateInput(request.form["userUuid"])
        filterByAuthor = (
            getBoolFromString(validateInput(request.form["filterByAuthor"]))
            if "filterByAuthor" in request.form.keys()
            else False
        )
        includeGroupsRules = (
            getBoolFromString(validateInput(request.form["includeGroupsRules"]))
            if "includeGroupsRules" in request.form.keys()
            else False
        )
        orderByPriority = (
            getBoolFromString(validateInput(request.form["orderByPriority"]))
            if "orderByPriority" in request.form.keys()
            else False
        )
        includeTriggerCategory = (
            getBoolFromString(validateInput(request.form["includeTriggerCategory"]))
            if "includeTriggerCategory" in request.form.keys()
            else False
        )

        try:
            categoriesFilter = request.form["categoriesFilter"] if "categoriesFilter" in request.form.keys() else None
        except Exception as e:
            return returnError(e)

        usernameFilter = username if filterByAuthor else None

        try:
            session = SessionManager()
            session.checkSessionValidity(sessionKey, userUuid)
            buildingsManager = BuildingsManager()
            buildingsManager.checkUserBinding(buildingName, username)
            roomsManager = RoomsManager()

            return returnResult(
                roomsManager.getRules(
                    roomName=roomName,
                    buildingName=buildingName,
                    username=usernameFilter,
                    includeGroupsRules=includeGroupsRules,
                    orderByPriority=orderByPriority,
                    includeDisabled=True,
                    categoriesFilter=categoriesFilter,
                    includeTriggerCategory=includeTriggerCategory,
                )
            )
        except Exception as e:
            return returnError(e)
Example #7
0
def addRoomToGroup(username=None, buildingName=None, groupId=None, roomName=None):
    if request.method == "POST":

        sessionKey = validateInput(request.form["sessionKey"])
        userUuid = validateInput(request.form["userUuid"])

        try:
            session = SessionManager()
            session.checkSessionValidity(sessionKey, userUuid)
            buildingsManager = BuildingsManager()
            buildingsManager.checkUserBinding(buildingName, username)
            groupsManager = GroupsManager()
            return returnResult(groupsManager.addRoom(groupId=groupId, buildingName=buildingName, roomName=roomName))
        except Exception as e:
            return returnError(e)
Example #8
0
def roomActiveRules(username=None, buildingName=None, roomName=None):
    if request.method == "POST":

        sessionKey = validateInput(request.form["sessionKey"])
        userUuid = validateInput(request.form["userUuid"])

        try:
            session = SessionManager()
            session.checkSessionValidity(sessionKey, userUuid)
            buildingsManager = BuildingsManager()
            buildingsManager.checkUserBinding(buildingName, username)
            roomsManager = RoomsManager()
            return returnResult(roomsManager.getActiveRulesId(roomName=roomName, buildingName=buildingName))
        except Exception as e:
            return returnError(e)
Example #9
0
def addRoomToBuilding(username=None, buildingName=None, roomName=None):

    if request.method == "POST":

        sessionKey = validateInput(request.form["sessionKey"])
        userUuid = validateInput(request.form["userUuid"])
        description = validateInput(request.form["description"])

        try:
            session = SessionManager()
            session.checkSessionValidity(sessionKey, userUuid)
            buildingsManager = BuildingsManager()

            return returnResult(
                buildingsManager.addRoom(roomName=roomName, buildingName=buildingName, description=description)
            )
        except Exception as e:
            return returnError(e)
Example #10
0
def disableRuleInRoom(username=None, buildingName=None, roomName=None, ruleId=None):
    if request.method == "POST":

        sessionKey = validateInput(request.form["sessionKey"])
        userUuid = validateInput(request.form["userUuid"])

        try:
            session = SessionManager()
            session.checkSessionValidity(sessionKey, userUuid)
            buildingsManager = BuildingsManager()
            buildingsManager.checkUserBinding(buildingName, username)
            roomsManager = RoomsManager()

            return returnResult(
                roomsManager.disableRule(
                    ruleId=ruleId, buildingName=buildingName, roomName=roomName, editorUuid=userUuid
                )
            )
        except Exception as e:
            return returnError(e)
Example #11
0
	def start(self):

		import time,datetime
		startTimeMilliseconds = long((time.time() + 0.5) * 1000)

		analyzedRoomCounter = 0

		flash("Starting the actuation process...", "yellow")

		buildings = Buildings()
		buildingsManager = BuildingsManager()
		groupsManager = GroupsManager()
		rules = Rules()

		rules.resetActiveRules()
		
		for building in buildings.getAllBuildings():

			flash("Working on building '" + building.buildingName + "'...", "blue")

			triggeredRules = []
			triggeredRulesId = []
			
			# Getting all the triggered rules for the considered building	
			buildingRules = building.getRules()

			if len(buildingRules) == 0:
				flash("Nothing to do...")

			if len(buildingRules):
				for rule in buildingRules:

					if rule.roomName and not rule.groupId:

						if self.skipRuleOnRoomFilter(buildingName = building.buildingName, roomName = rule.roomName): continue
						analyzedRoomCounter += 1

						if self.checkRuleTrigger(rule):
							# If the antecedent of the rule is triggered, let us store the rule as triggered!
							triggeredRules.append(rule)
							triggeredRulesId.append(rule.id)
					
					elif rule.groupId and not rule.roomName:

						groupRoomList = groupsManager.getRooms(buildingName = building.buildingName, groupId = rule.groupId)["rooms"]
						for room in groupRoomList:

							if self.skipRuleOnRoomFilter(buildingName = building.buildingName, roomName = room.roomName): continue

							roomName = room["roomName"]
							newRule = copy.copy(rule)			# I need to copy the object to modify the room name
							newRule.roomName = roomName

							if self.checkRuleTrigger(newRule):
								# If the antecedent of the rule is triggered, let us store the rule as triggered!
								triggeredRules.append(newRule)
								triggeredRulesId.append(newRule.id)



				flash(building.buildingName + " - Total rules: " + str(len(buildingRules)), "gray")
				flash(building.buildingName + " - Triggered rules: " + str(len(triggeredRules)), "gray")


				# Now, let us partition rules among "Pure-Room-Rules" and "CRVG-Rules"
				roomScheduledRules = {}
				crvgScheduledRules = {}

				for rule in triggeredRules:



					if rule.roomName:

						# In this case we are selecting the rules spiecified for a specific room.
						# If the rule (for a specific category) is saved into a room belonging to a CRVG, I have to save it into the crvgScheduledRules set.
						# If the rule is not part of CRVG ruleset, then it is savet into the roomScheduledRules set.

						buildingName = building.buildingName
						roomName = rule.roomName
						validationCategories = [rule.category]
						crvgList = buildingsManager.getCrossRoomValidationGroups(buildingName = buildingName, roomName = roomName, validationCategories = validationCategories)

						if len(crvgList) == 0:


							if not roomName in roomScheduledRules.keys():
								roomScheduledRules[roomName] = []

							roomScheduledRules[roomName].append(rule)

						elif len(crvgList) == 1:

							
							if not crvgList[0].id in crvgScheduledRules.keys():
								crvgScheduledRules[crvgList[0].id] = []
							
							rule.gropuId = crvgList[0].id
							crvgScheduledRules[crvgList[0].id].append(rule)

						else:
							raise WrongBuildingGroupRipartitionError(roomName + " has been found to be part of two different Cross Room Validation Groups. This is not allowed.")

					elif rule.groupId and not rule.roomName:


						# Here we are selecting those rules that have been specified of a specific group.
						# Those groups can be standard groups or CRV GROUPS on a specific category. In the first case, i have to add a copy of the rule in each of the group rooms.
						# In the second case I have to add the rule to the corresponding CRVG dict (if the rule category is right).

						if groupsManager.isCrossRoomsValidationGroup(buildingName = building.buildingName, groupId = rule.groupId, crossRoomsValidationCategory = rule.category):

							if not rule.groupId in crvgScheduledRules.keys():
								crvgScheduledRules[rule.groupId] = []
							
							crvgScheduledRules[rule.groupId].append(rule)

						else:		
							raise UnknownError("Unexpected error into the database.")




					else:
						raise UnknownError("The rule with id " + rule.id + " has both the groupId and roomName field not null.")

				flash(building.buildingName + " - Number of rooms: " + str(len(roomScheduledRules.keys())), "gray")
				flash(building.buildingName + " - Number of CRV Groups: " + str(len(crvgScheduledRules.keys())), "gray")

				actuatedRulesCounter = 0

				flash("Executing actions for rooms...", "yellow")
				# Executing the rules per each room
				# In the case I have the same action category, I'll take the action with higher priority
				for roomName in roomScheduledRules.keys():
					flash("Room [" + building.buildingName + "." + roomName + "]..." , "blue")				
					ruleList = roomScheduledRules[roomName]
					#Let us order by rule priority
					ruleList = sorted(ruleList, key=lambda rule: rule.getPriority(), reverse=True)

					alreadyAppliedCategories = []
					for rule in ruleList:
							
						if rule.category not in alreadyAppliedCategories:

							alreadyAppliedCategories.append(rule.category)
							self.executeRule(rule)
							actuatedRulesCounter += 1
						else:
							flash(building.buildingName + " - Room " + roomName + ", ruleId " + str(rule.id) + " ignored.")

				flash("Executing actions for CRV Groups...", "yellow")
				for crvgId in crvgScheduledRules.keys():
					flash("Group " + building.buildingName + ".g[" + str(crvgId) + "]..." , "blue")				
					ruleList = crvgScheduledRules[crvgId]

					#Let us order by rule priority
					ruleList = sorted(ruleList, key=lambda rule: rule.getPriority(), reverse=True)

					alreadyAppliedCategories = []
					for rule in ruleList:
						if rule.category not in alreadyAppliedCategories:
							alreadyAppliedCategories.append(rule.category)
							self.executeRule(rule)
							actuatedRulesCounter += 1
						else:
							flash(building.buildingName + " - CRVGroup " + str(crvgId) + ", ruleId " + str(rule.id) + " ignored.")
							self.notifyIgnoredRule(rule)

		flash("The actuation process is ended.", "yellow")		
		endTimeMilliseconds = long((time.time() + 0.5) * 1000)
		opTimeMilliseconds = endTimeMilliseconds - startTimeMilliseconds
		flash("RunTimeRuleActuation:::RoomFilter=" + str(self.roomFilter) + "::Time=" + str(opTimeMilliseconds) + "::NumberOfRules:" + str(analyzedRoomCounter) + "::TriggeredRules:" + str(len(triggeredRules)) + "::ActuatedRules:" + str(actuatedRulesCounter) + "::IgnoredRules:" + str(len(triggeredRules)-actuatedRulesCounter))