Exemple #1
0
def cyclereset(element):
	global AUTO_data
	waitingtime=hardwaremod.toint(automationdbmod.searchdata("element",element,"pausebetweenwtstepsmin"),0)
	statusdataDBmod.write_status_data(AUTO_data,element,"lastactiontime",datetime.utcnow() - timedelta(minutes=waitingtime))
	statusdataDBmod.write_status_data(AUTO_data,element,"status","ok")
	statusdataDBmod.write_status_data(AUTO_data,element,"actionvalue",0)	
	statusdataDBmod.write_status_data(AUTO_data,element,"alertcounter",0)	
	statusdataDBmod.write_status_data(AUTO_data,element,"infocounter",0)
Exemple #2
0
def cyclereset(element):
    global AUTO_data
    waitingtime = hardwaremod.toint(
        automationdbmod.searchdata("element", element,
                                   "pausebetweenwtstepsmin"), 0)
    AUTO_data[element] = {
        "lastactiontime": datetime.utcnow() - timedelta(minutes=waitingtime),
        "status": "ok",
        "actionvalue": 0,
        "alertcounter": 0,
        "infocounter": 0
    }
Exemple #3
0
def automationexecute(refsensor, element):
    sensor = automationdbmod.searchdata("element", element, "sensor")
    # check the sensor
    if refsensor == sensor:
        logger.info('automation Pairing OK ---> Actuator: %s , Sensor: %s',
                    element, sensor)
        # check the watering mode
        modelist = ["None", "Full Auto", "Emergency Activation", "Alert Only"]
        workmode = checkworkmode(element)

        if (workmode == "None"):
            # None case
            print "No Action required, workmode set to None, element: ", element
            logger.info(
                "No Action required, workmode set to None, element: %s ",
                element)
            return

        if (workmode == ""):
            logger.info("Not able to get the workmode: %s ", element)
            return

        logger.info('Automantion, Get all the parameters')
        sensormaxthreshold = hardwaremod.tonumber(
            automationdbmod.searchdata("element", element,
                                       "sensor_threshold")[1], 0)
        sensorminthreshold = hardwaremod.tonumber(
            automationdbmod.searchdata("element", element,
                                       "sensor_threshold")[0],
            sensormaxthreshold)
        actuatormaxthreshold = hardwaremod.tonumber(
            automationdbmod.searchdata("element", element,
                                       "actuator_threshold")[1], 0)
        actuatorminthreshold = hardwaremod.tonumber(
            automationdbmod.searchdata("element", element,
                                       "actuator_threshold")[0],
            actuatormaxthreshold)

        # evaluate variables for operational period check

        starttime = datetime.strptime(
            automationdbmod.searchdata("element", element, "allowedperiod")[0],
            '%H:%M').time()
        endtime = datetime.strptime(
            automationdbmod.searchdata("element", element, "allowedperiod")[1],
            '%H:%M').time()

        # get other parameters
        maxstepnumber = hardwaremod.toint(
            automationdbmod.searchdata("element", element, "stepnumber"), 1)
        waitingtime = hardwaremod.toint(
            automationdbmod.searchdata("element", element,
                                       "pausebetweenwtstepsmin"), 1)
        mailtype = automationdbmod.searchdata("element", element,
                                              "mailalerttype")
        averageminutes = hardwaremod.tonumber(
            automationdbmod.searchdata("element", element, "averagesample"), 1)
        mathoperation = automationdbmod.searchdata("element", element,
                                                   "mathoperation")

        # check sensor timetrigger
        sensorcontrolcommand = hardwaremod.searchdata(hardwaremod.HW_INFO_NAME,
                                                      refsensor,
                                                      hardwaremod.HW_CTRL_CMD)
        logger.info('Sensor control command: %s , Sensor: %s',
                    sensorcontrolcommand, sensor)
        if sensorcontrolcommand == "returnzero":
            logger.info('Modify parameter for the timetrigger')
            #adjust the parameters in the way the activation condition is always obtained
            sensormaxthreshold = 1
            sensorminthreshold = -1
            maxstepnumber = 1
            averageminutes = 0

        # Calculated Variables
        if maxstepnumber < 1:
            # not possible to proceed
            print "No Action required, maxstepnumber <1, element: ", element
            logger.info("No Action required, maxstepnumber <1, element: %s ",
                        element)
            return
        interval = (sensormaxthreshold - sensorminthreshold) / maxstepnumber
        actuatorinterval = (actuatormaxthreshold -
                            actuatorminthreshold) / maxstepnumber
        P = []
        for I in range(0, maxstepnumber + 1):
            P.append(actuatorminthreshold + I * actuatorinterval)

        # ------------------------ Automation alghoritm
        if workmode == "Full Auto":
            # check if inside the allowed time period
            print "full Auto Mode"
            logger.info('full auto mode --> %s', element)
            timeok = isNowInTimePeriod(
                starttime, endtime,
                datetime.now().time())  # don't use UTC here!
            print "inside allowed time ", timeok, " starttime ", starttime, " endtime ", endtime
            if timeok:
                logger.info('inside allowed time')
                isok, sensorvalue = sensorreading(
                    sensor, averageminutes, mathoperation
                )  # operation of sensor readings for a number of sample
                if isok:
                    print "Sensor Value ", sensorvalue

                    if sensorminthreshold <= sensormaxthreshold:
                        print "Algorithm , element: ", element
                        logger.info("Forward algorithm  , element: %s ",
                                    element)

                        Inde = 0
                        maxs = sensorminthreshold + Inde * interval
                        if sensorvalue <= maxs:
                            status = "belowthreshold"
                            logger.info('below Minthreshold')
                            value = P[Inde]
                            # do relevant stuff
                            CheckActivateNotify(element, waitingtime, value,
                                                mailtype, sensor, sensorvalue)

                        Inde = 1
                        for I in range(Inde, maxstepnumber):
                            mins = sensorminthreshold + (I - 1) * interval
                            maxs = sensorminthreshold + I * interval
                            if mins < sensorvalue <= maxs:
                                value = P[I]
                                logger.info('inside Range')
                                # do relevant stuff
                                CheckActivateNotify(element, waitingtime,
                                                    value, mailtype, sensor,
                                                    sensorvalue)

                        Inde = maxstepnumber
                        mins = sensorminthreshold + (Inde - 1) * interval
                        if mins < sensorvalue:
                            print "INDE:", Inde
                            value = P[Inde]
                            logger.info('beyond Range')
                            # do relevant stuff
                            CheckActivateNotify(element, waitingtime, value,
                                                mailtype, sensor, sensorvalue)
                        # END MAIN ALGORITHM

                    else:  # to be added case of inverse sensor condition, where the sensorminthreshold is higher than the sensormaxthreshold
                        print "Reverse Algorithm , element: ", element
                        logger.info("Reverse Algorithm  , element: %s ",
                                    element)

                        Inde = 0
                        maxs = sensorminthreshold + Inde * interval
                        if sensorvalue >= maxs:
                            status = "belowthreshold"
                            logger.info('Above MAXthreshold')
                            value = P[Inde]
                            # do relevant stuff
                            CheckActivateNotify(element, waitingtime, value,
                                                mailtype, sensor, sensorvalue)

                        Inde = Inde + 1
                        for I in range(Inde, maxstepnumber):
                            mins = sensorminthreshold + (I - 1) * interval
                            maxs = sensorminthreshold + I * interval
                            if mins > sensorvalue >= maxs:
                                value = P[I]
                                # do relevant stuff
                                CheckActivateNotify(element, waitingtime,
                                                    value, mailtype, sensor,
                                                    sensorvalue)

                        Inde = maxstepnumber
                        mins = sensorminthreshold + (Inde - 1) * interval
                        if mins > sensorvalue:
                            print "INDE:", Inde
                            value = P[Inde]
                            # do relevant stuff
                            CheckActivateNotify(element, waitingtime, value,
                                                mailtype, sensor, sensorvalue)
                        # END MAIN ALGORITHM - Reverse
                else:
                    logger.error(
                        'No valid calculation operation on the stored sensor data'
                    )
            else:
                logger.info('Outside allowed Time, Stop')

        elif workmode == "Emergency Activation":
            print "Emergency Activation"

        elif workmode == "Alert Only":
            print "Alert Only"

        # implment Critical alert message in case the sensor value is one interval more than Max_threshold

        isok, sensorvalue = sensorreading(
            sensor, averageminutes, mathoperation
        )  # operation of sensor readings for a number of sample
        if isok:
            if sensorminthreshold <= sensormaxthreshold:
                if sensorvalue > sensormaxthreshold + interval:
                    logger.info('sensor %s exceeding limits', sensor)
                    textmessage = "CRITICAL: " + sensor + " reading " + str(
                        sensorvalue
                    ) + " exceeding threshold limits, need to check the " + element
                    print textmessage
                    #send alert mail notification
                    alertcounter = statusdataDBmod.read_status_data(
                        AUTO_data, element, "alertcounter")
                    if alertcounter < 2:
                        if (mailtype != "none"):
                            emailmod.sendallmail("alert", textmessage)
                        logger.error(textmessage)
                        statusdataDBmod.write_status_data(
                            AUTO_data, element, "alertcounter",
                            alertcounter + 1)

            else:
                if sensorvalue < sensormaxthreshold + interval:
                    logger.info('sensor %s exceeding limits', sensor)
                    textmessage = "CRITICAL: " + sensor + " reading " + str(
                        sensorvalue
                    ) + " exceeding threshold limits, need to check the " + element
                    print textmessage
                    #send alert mail notification
                    alertcounter = statusdataDBmod.read_status_data(
                        AUTO_data, element, "alertcounter")
                    if alertcounter < 2:
                        if (mailtype != "none"):
                            emailmod.sendallmail("alert", textmessage)
                        logger.error(textmessage)
                        statusdataDBmod.write_status_data(
                            AUTO_data, element, "alertcounter",
                            alertcounter + 1)

    return
Exemple #4
0
def checkworkmode(element):
    return automationdbmod.searchdata("element", element, "workmode")
def cycleresetall():
	elementlist= automationdbmod.getelementlist()
	for element in elementlist:
		waitingtime=hardwaremod.toint(automationdbmod.searchdata("element",element,"pausebetweenwtstepsmin"),0)
		#print("Cycle reset all ------------------------------------_>", waitingtime , "   ", element)
		cyclereset(element)
Exemple #6
0
def automationexecute(refsensor,element):		
	sensor=automationdbmod.searchdata("element",element,"sensor")
	# check the sensor
	if refsensor==sensor:		
		logger.info('automation Pairing OK ---> Actuator: %s , Sensor: %s', element, sensor)
		# check the watering mode
		modelist=["None", "Full Auto" , "Emergency Activation" , "Alert Only"]
		workmode=checkworkmode(element)

		if (workmode=="None"):
			# None case
			print "No Action required, workmode set to None, element: " , element
			logger.info("No Action required, workmode set to None, element: %s " , element)
			return

		if (workmode==""):
			logger.info("Not able to get the workmode: %s " , element)
			return

		logger.info('Automantion, Get all the parameters')
		sensormaxthreshold=hardwaremod.tonumber(automationdbmod.searchdata("element",element,"sensor_threshold")[1],0)
		sensorminthreshold=hardwaremod.tonumber(automationdbmod.searchdata("element",element,"sensor_threshold")[0],sensormaxthreshold)
		actuatormaxthreshold=hardwaremod.tonumber(automationdbmod.searchdata("element",element,"actuator_threshold")[1],0)
		actuatorminthreshold=hardwaremod.tonumber(automationdbmod.searchdata("element",element,"actuator_threshold")[0],actuatormaxthreshold)

		# evaluate variables for operational period check
		now = datetime.now()
		nowtime = now.time()
		starttimeh=hardwaremod.toint(automationdbmod.searchdata("element",element,"allowedperiod")[0].split(":")[0],0)
		starttimem=hardwaremod.toint(automationdbmod.searchdata("element",element,"allowedperiod")[0].split(":")[1],0)
		endtimeh=hardwaremod.toint(automationdbmod.searchdata("element",element,"allowedperiod")[1].split(":")[0],1)
		endtimem=hardwaremod.toint(automationdbmod.searchdata("element",element,"allowedperiod")[1].split(":")[1],0)
		starttime=time(starttimeh,starttimem)
		endtime=time(endtimeh,endtimem)		
		
		# get other parameters
		maxstepnumber=hardwaremod.toint(automationdbmod.searchdata("element",element,"stepnumber"),1)
		waitingtime=hardwaremod.toint(automationdbmod.searchdata("element",element,"pausebetweenwtstepsmin"),1)
		mailtype=automationdbmod.searchdata("element",element,"mailalerttype")
		averageminutes=hardwaremod.tonumber(automationdbmod.searchdata("element",element,"averagesample"),1)
		mathoperation=automationdbmod.searchdata("element",element,"mathoperation")

		# check sensor timetrigger
		sensorcontrolcommand=hardwaremod.searchdata(hardwaremod.HW_INFO_NAME,refsensor,hardwaremod.HW_CTRL_CMD)
		logger.info('Sensor control command: %s , Sensor: %s', sensorcontrolcommand, sensor)
		if sensorcontrolcommand=="returnzero":
			logger.info('Modify parameter for the timetrigger')			
			#adjust the parameters in the way the activation condition is always obtained
			sensormaxthreshold=1
			sensorminthreshold=-1
			maxstepnumber=1
			averageminutes=0

		
		# Calculated Variables
		if maxstepnumber<1:
			# not possible to proceed
			print "No Action required, maxstepnumber <1, element: " , element
			logger.info("No Action required, maxstepnumber <1, element: %s " , element)
			return
		interval=(sensormaxthreshold-sensorminthreshold)/maxstepnumber
		actuatorinterval=(actuatormaxthreshold-actuatorminthreshold)/maxstepnumber
		P=[]
		for I in range(0, maxstepnumber+1):
			P.append(actuatorminthreshold+I*actuatorinterval)
		
		
		
		
		# ------------------------ Automation alghoritm
		if workmode=="Full Auto":
			# check if inside the allowed time period
			print "full Auto Mode"
			logger.info('full auto mode --> %s', element)
			timeok=isNowInTimePeriod(starttime, endtime, nowtime)
			print "inside allowed time ", timeok , " starttime ", starttime , " endtime ", endtime
			if timeok:
				logger.info('inside allowed time')
				isok,sensorvalue=sensorreading(sensor,averageminutes,mathoperation) # operation of sensor readings for a number of sample
				if isok:
					print "Sensor Value ", sensorvalue
					
					if sensorminthreshold<=sensormaxthreshold:
						print "Algorithm , element: " , element
						logger.info("Forward algorithm  , element: %s " , element)
						
					
						Inde=0
						maxs=sensorminthreshold+Inde*interval
						if sensorvalue<=maxs:
							status="belowthreshold"
							logger.info('below Minthreshold')
							value=P[Inde]
							# do relevant stuff	
							CheckActivateNotify(element,waitingtime,value,mailtype,sensor,sensorvalue)
						
						Inde=1
						for I in range(Inde, maxstepnumber):
							mins=sensorminthreshold+(I-1)*interval
							maxs=sensorminthreshold+I*interval
							if mins<sensorvalue<=maxs:
								value=P[I]			
								logger.info('inside Range')		
								# do relevant stuff	
								CheckActivateNotify(element,waitingtime,value,mailtype,sensor,sensorvalue)		
						
						Inde=maxstepnumber
						mins=sensorminthreshold+(Inde-1)*interval										
						if mins<sensorvalue:
							print "INDE:",Inde
							value=P[Inde]
							logger.info('beyond Range')
							# do relevant stuff	
							CheckActivateNotify(element,waitingtime,value,mailtype,sensor,sensorvalue)
						# END MAIN ALGORITHM
						
					else: # to be added case of inverse sensor condition, where the sensorminthreshold is higher than the sensormaxthreshold
						print "Reverse Algorithm , element: " , element
						logger.info("Reverse Algorithm  , element: %s " , element)						
									
						Inde=0
						maxs=sensorminthreshold+Inde*interval
						if sensorvalue>=maxs:
							status="belowthreshold"
							logger.info('Above MAXthreshold')
							value=P[Inde]
							# do relevant stuff	
							CheckActivateNotify(element,waitingtime,value,mailtype,sensor,sensorvalue)
						
						Inde=Inde+1
						for I in range(Inde, maxstepnumber):
							mins=sensorminthreshold+(I-1)*interval
							maxs=sensorminthreshold+I*interval
							if mins>sensorvalue>=maxs:
								value=P[I]					
								# do relevant stuff	
								CheckActivateNotify(element,waitingtime,value,mailtype,sensor,sensorvalue)		
						
						Inde=maxstepnumber
						mins=sensorminthreshold+(Inde-1)*interval										
						if mins>sensorvalue:
							print "INDE:",Inde
							value=P[Inde]
							# do relevant stuff	
							CheckActivateNotify(element,waitingtime,value,mailtype,sensor,sensorvalue)
						# END MAIN ALGORITHM - Reverse				
			else:
				logger.info('No valid calculation operation on the stored sensor data')
				
		elif workmode=="Emergency Activation":
			print "Emergency Activation"		
		
		elif workmode=="Alert Only":
			print "Alert Only"					
							


		# implment Critical alert message in case the sensor value is one interval more than Max_threshold

		isok,sensorvalue=sensorreading(sensor,averageminutes,mathoperation) # operation of sensor readings for a number of sample
		if isok:
			if sensorminthreshold<=sensormaxthreshold:
				if sensorvalue>sensormaxthreshold+interval:
					logger.info('sensor %s exceeding limits', sensor)
					textmessage="CRITICAL: "+ sensor + " reading " + str(sensorvalue) + " exceeding threshold limits, need to check the " + element
					print textmessage
					#send alert mail notification
					alertcounter=statusdataDBmod.read_status_data(AUTO_data,element,"alertcounter")
					if alertcounter<2:
						emailmod.sendallmail("alert", textmessage)							
						logger.error(textmessage)
						statusdataDBmod.write_status_data(AUTO_data,element,"alertcounter",alertcounter+1)

			else:
				if sensorvalue<sensormaxthreshold+interval:
					logger.info('sensor %s exceeding limits', sensor)
					textmessage="CRITICAL: "+ sensor + " reading " + str(sensorvalue) + " exceeding threshold limits, need to check the " + element
					print textmessage
					#send alert mail notification
					alertcounter=statusdataDBmod.read_status_data(AUTO_data,element,"alertcounter")
					if alertcounter<2:
						emailmod.sendallmail("alert", textmessage)							
						logger.error(textmessage)
						statusdataDBmod.write_status_data(AUTO_data,element,"alertcounter",alertcounter+1)

	return
Exemple #7
0
def checkworkmode(element):
	return automationdbmod.searchdata("element",element,"workmode")
Exemple #8
0
def cycleresetall():
	global AUTO_data
	elementlist= automationdbmod.getelementlist()
	for element in elementlist:
		waitingtime=hardwaremod.toint(automationdbmod.searchdata("element",element,"pausebetweenwtstepsmin"),0)
		AUTO_data[element]={"lastactiontime":datetime.now() - timedelta(minutes=waitingtime),"status":"ok","actionvalue":0, "alertcounter":0, "infocounter":0}