コード例 #1
0
ファイル: interruptmod.py プロジェクト: ivan000/hydrosys4mod
def CheckandFollowup(element):
	global AUTO_data
	actionmodeafterfirst=interruptdbmod.searchdata("element",element,"actionmode_afterfirst")
	actuatoroutputfollowup=hardwaremod.tonumber(interruptdbmod.searchdata("element",element,"folloup_output"),0)
	# section below is the follow-up
	if actionmodeafterfirst=="Follow-up action" or actionmodeafterfirst=="Remove and Follow-up" or actionmodeafterfirst=="Extend and Follow-up": # execute the action followup, no variation in the preemption period
		value=actuatoroutputfollowup
		# followup action					
		print("Implement Actuator Value followup", value)
		logger.info('Procedure to start actuator followup %s, for value = %s', element, value)		
		isok=activateactuator(element, value)
		
		if isok:
			statusdataDBmod.write_status_data(AUTO_data,element,"lastactiontime",datetime.utcnow())
			statusdataDBmod.write_status_data(AUTO_data,element,"actionvalue",value)				
			return True
	return False
コード例 #2
0
def checksensorcondition(sensornamelist,threshold, MinutesOfAverage, ONOFF=True):

	valid=False	
	passed=False
	thresholdnum=hardwaremod.tonumber(threshold,"NA")
	
	if (thresholdnum!="NA"):	

		if sensornamelist:
			valid=True
			
			sensordata=[]		
			sensorname=sensornamelist[0]  # get first found sensor in the list
			sensordbmod.getsensordbdata(sensorname,sensordata)
			starttimecalc=datetime.now()-timedelta(minutes=int(MinutesOfAverage))
			isok , calclist=sensordbmod.EvaluateDataPeriod(sensordata,starttimecalc,datetime.now())
			calculation=calclist["average"]
			logger.info('Waterpump Check sensor =%s ', sensorname)
			logger.info('Sensor=%s , Theshold=%s ', str(calculation), str(threshold))
			print('Sensor= ', str(calculation),', Theshold= ', str(threshold))
			
			test="below ON"
			if (calculation<thresholdnum):
				passed=True
			if not ONOFF:
				passed=not passed
				test="above ON"
							
			print('check ', test)
			if passed:		
				logger.info('check %s PASSED, sensor1=%s , Theshold=%s ', test , str(calculation), str(threshold))	
				print('PASSED, sensor1=%s , Theshold=%s ',  str(calculation), str(threshold))		
			else:
				logger.info('check %s FAILED', test)
				print('check FAILED')		
	
	return valid , passed	
コード例 #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
コード例 #4
0
def startpump(target, activationseconds, MinAveragetemp, MaxAverageHumid):

    logger.info('WateringPlan Startpump evaluation: %s', target)
    #workmode=autowateringmod.checkworkmode(target)
    #if workmode=="Full Auto":
    if target in autowateringmod.allowwateringplan:
        if not autowateringmod.allowwateringplan[target]:
            logger.info(
                'WateringPlan: %s pump activation blocked by automation',
                target)
            pumpit = False
            return False

    duration = hardwaremod.toint(activationseconds, 0)
    print(target, " ", duration, " ", datetime.now())

    # evaluate parameters
    #MinAverageLight=500 not used now
    MinutesOfAverage = 120  #minutes in which the average data is calculated from sensor sampling

    print("waterpump check")
    logger.info('execute water pump check %s',
                datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

    # then check the temperature and Humidity

    print("Check Humidity and Temperature")

    MinAveragetempnum = hardwaremod.tonumber(MinAveragetemp, "NA")
    MaxAverageHumidnum = hardwaremod.tonumber(MaxAverageHumid, "NA")

    # all the below conditions should be verified to start the PUMP
    pumpit = True

    hsensornamelist = hardwaremod.getsensornamebymeasure(
        hardwaremod.MEASURELIST[1])
    if hsensornamelist:
        sensordata = []
        hsensorname = hsensornamelist[0]  # get first found sensor in the list
        sensordbmod.getsensordbdata(hsensorname, sensordata)
        starttimecalc = datetime.now() - timedelta(
            minutes=int(MinutesOfAverage))
        isok, quantitylist = sensordbmod.EvaluateDataPeriod(
            sensordata, starttimecalc, datetime.now())
        humquantity = quantitylist["average"]

        logger.info(
            'Waterpump Check parameter if humquantity=%s < MaxAverageHumid=%s ',
            str(humquantity), str(MaxAverageHumid))
        print('Waterpump Check parameter if humquantity=', humquantity,
              ' < MaxAverageHumid=', MaxAverageHumid)

        if (MaxAverageHumidnum != "NA"):
            if (humquantity < MaxAverageHumidnum):
                logger.info(
                    'Humidity check PASSED, humquantity=%s < MaxAverageHumid=%s ',
                    str(humquantity), str(MaxAverageHumid))
            else:
                logger.info('Humidity check FAILED')
                print('Humidity check FAILED')
                pumpit = False

    tsensornamelist = hardwaremod.getsensornamebymeasure(
        hardwaremod.MEASURELIST[0])
    if tsensornamelist:
        sensordata = []
        tsensorname = tsensornamelist[0]  # get first found sensor in the list
        sensordbmod.getsensordbdata(tsensorname, sensordata)
        starttimecalc = datetime.now() - timedelta(
            minutes=int(MinutesOfAverage))
        isok, quantitylist = sensordbmod.EvaluateDataPeriod(
            sensordata, starttimecalc, datetime.now())
        tempquantity = quantitylist["average"]
        logger.info(
            'Waterpump Check parameter if tempquantity=%s > MinAveragetemp=%s ',
            str(tempquantity), str(MinAveragetemp))
        print('Waterpump Check parameter if tempquantity=', tempquantity,
              ' > MinAveragetemp=', MinAveragetemp)

        if (MinAveragetempnum != "NA"):
            if (tempquantity > MinAveragetempnum):
                logger.info(
                    'Temperature check PASSED, tempquantity=%s > MinAveragetemp=%s ',
                    str(tempquantity), str(MinAveragetemp))
            else:
                logger.info('Temperature check FAILED')
                print('Temperature check FAILED')
                pumpit = False

    # weather Forecast
    sensorname = weatherAPImod.DefaultCounterName()
    sensorlist = sensordbmod.gettablelist()
    if sensorname in sensorlist:
        ActiveActuatorList = weatherAPImod.ActiveActuatorList()
        if target in ActiveActuatorList:
            sensordata = []
            samplesnumber = 1
            sensordbmod.getsensordbdatasamplesN(sensorname, sensordata,
                                                samplesnumber)
            MaxPastMinutes = 1200
            starttimecalc = datetime.now() - timedelta(minutes=MaxPastMinutes)
            isok, quantitylist = sensordbmod.EvaluateDataPeriod(
                sensordata, starttimecalc, datetime.now())
            if isok:
                RainMultipier = quantitylist["average"]
                logger.info('Waterpump weather multiplier =%s ',
                            str(RainMultipier))
            else:
                logger.warning(
                    'Waterpump weather multiplier NOT found within 20 Hours apply 100 '
                )
                RainMultipier = 100
            duration = int(duration * RainMultipier / 100)
    else:
        logger.warning('Weather Sensor not found, no multpilier applied ')

    if pumpit:
        # activation of the doser before the pump
        doseron = autofertilizermod.checkactivate(target, duration)
        # watering
        #hardwaremod.makepulse(target,duration)
        activateandregister(target, duration)
        # salva su database
        #logger.info('Switch Pump %s ON, optional time for sec = %s', target, duration)
        #print 'Pump ON, optional time for sec =', duration
        #actuatordbmod.insertdataintable(target,duration)

    return True
コード例 #5
0
def interruptexecute(refsensor, element):

    sensor = refsensor
    #logger.info('interrupt Pairing OK ---> Actuator: %s , Sensor: %s', element, sensor)

    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('Interrupt, Get all the parameters')
    interrupt_validinterval = hardwaremod.tonumber(
        interruptdbmod.searchdata("element", element,
                                  "interrupt_validinterval"), 0)
    #"Counter Only"
    if workmode == "Counter Only":
        CounterOnlyNew(element, sensor, interrupt_validinterval)
        return

    interrupt_triggernumber = hardwaremod.tonumber(
        interruptdbmod.searchdata("element", element,
                                  "interrupt_triggernumber"), 1)
    actuatoroutput = hardwaremod.tonumber(
        interruptdbmod.searchdata("element", element, "actuator_output"), 0)
    actuatoroutputfollowup = hardwaremod.tonumber(
        interruptdbmod.searchdata("element", element, "folloup_output"), 0)

    # evaluate variables for operational period check
    starttime = datetime.strptime(
        interruptdbmod.searchdata("element", element, "allowedperiod")[0],
        '%H:%M').time()
    endtime = datetime.strptime(
        interruptdbmod.searchdata("element", element, "allowedperiod")[1],
        '%H:%M').time()

    # get other parameters
    seonsormode = interruptdbmod.searchdata("element", element, "sensor_mode")

    triggermode = interruptdbmod.searchdata("element", element, "trigger_mode")

    preemptiontimemin = hardwaremod.toint(
        interruptdbmod.searchdata("element", element, "preemptive_period"), 0)

    if preemptiontimemin == 0:
        # if relay, meaning cmd = pulse
        actuatortype = hardwaremod.searchdata(hardwaremod.HW_INFO_NAME,
                                              element, hardwaremod.HW_CTRL_CMD)
        if actuatortype == "pulse":
            preemptiontime = actuatoroutput  # if set to zero then get the time as the actuator (in case of relay)
        else:
            preemptiontime = 0
    else:
        preemptiontime = preemptiontimemin * 60

    mailtype = interruptdbmod.searchdata("element", element, "mailalerttype")

    actionmodeafterfirst = interruptdbmod.searchdata("element", element,
                                                     "actionmode_afterfirst")

    # time check

    # ------------------------ interrupt alghoritm

    if workmode == "Pre-emptive Blocking":
        # check if inside the allowed time period
        #print "Pre-emptive Blocking Mode"
        #logger.info('Pre-emptive Blocking 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:

            CheckActivateNotify(element, sensor, preemptiontime,
                                actuatoroutput, actionmodeafterfirst,
                                actuatoroutputfollowup, mailtype,
                                interrupt_triggernumber,
                                interrupt_validinterval, triggermode)

        else:
            logger.info('out of allowed operational time')

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

    return
コード例 #6
0
def startpump(target, activationseconds, MinAveragetemp, MaxAverageHumid):
    duration = 1000 * hardwaremod.toint(activationseconds, 0)
    print target, " ", duration, " ", datetime.now()
    logger.info('Startpump evaluation')
    # evaluate parameters
    #MinAverageLight=500 not used now
    MinutesOfAverage = 120  #minutes in which the average data is calculated from sensor sampling

    print "waterpump check"
    logger.info('execute water pump check %s',
                datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

    # then check the temperature and Humidity

    print "Check Humidity and Temperature"

    hsensornamelist = hardwaremod.getsensornamebymeasure(
        hardwaremod.MEASURELIST[1])
    if hsensornamelist:
        sensordata = []
        hsensorname = hsensornamelist[0]  # get first found sensor in the list
        sensordbmod.getsensordbdata(hsensorname, sensordata)
        starttimecalc = datetime.now() - timedelta(
            minutes=int(MinutesOfAverage))
        humquantity = sensordbmod.EvaluateDataPeriod(sensordata, starttimecalc,
                                                     datetime.now())["average"]
        logger.info(
            'Waterpump Check parameter if humquantity=%s < MaxAverageHumid=%s ',
            str(humquantity), str(MaxAverageHumid))
        print 'Waterpump Check parameter if humquantity=', humquantity, ' < MaxAverageHumid=', MaxAverageHumid

    tsensornamelist = hardwaremod.getsensornamebymeasure(
        hardwaremod.MEASURELIST[0])
    if tsensornamelist:
        sensordata = []
        tsensorname = tsensornamelist[0]  # get first found sensor in the list
        sensordbmod.getsensordbdata(tsensorname, sensordata)
        starttimecalc = datetime.now() - timedelta(
            minutes=int(MinutesOfAverage))
        tempquantity = sensordbmod.EvaluateDataPeriod(
            sensordata, starttimecalc, datetime.now())["average"]
        logger.info(
            'Waterpump Check parameter if tempquantity=%s > MinAveragetemp=%s ',
            str(tempquantity), str(MinAveragetemp))
        print 'Waterpump Check parameter if tempquantity=', tempquantity, ' > MinAveragetemp=', MinAveragetemp

    MinAveragetempnum = hardwaremod.tonumber(MinAveragetemp, "NA")
    MaxAverageHumidnum = hardwaremod.tonumber(MaxAverageHumid, "NA")

    # all the below conditions should be verified to start the PUMP
    pumpit = True

    if (MinAveragetempnum != "NA"):
        if (tempquantity > MinAveragetempnum):
            logger.info(
                'Temperature check PASSED, tempquantity=%s > MinAveragetemp=%s ',
                str(tempquantity), str(MinAveragetemp))
        else:
            logger.info('Temperature check FAILED')
            print 'Temperature check FAILED'
            pumpit = False

    if (MaxAverageHumidnum != "NA"):
        if (humquantity < MaxAverageHumidnum):
            logger.info(
                'Humidity check PASSED, humquantity=%s < MaxAverageHumid=%s ',
                str(humquantity), str(MaxAverageHumid))
        else:
            logger.info('Humidity check FAILED')
            print 'Humidity check FAILED'
            pumpit = False

    if pumpit:
        hardwaremod.makepulse(target, duration)
        # salva su database
        logger.info('Pump ON, optional time for sec = %s', duration)
        print 'Pump ON, optional time for sec =', duration
        actuatordbmod.insertdataintable(target, duration)
コード例 #7
0
ファイル: autowateringmod.py プロジェクト: shubh942213/Master
def autowateringexecute(refsensor, element):
    global AUTO_data
    sensor = autowateringdbmod.searchdata("element", element, "sensor")
    # check the sensor
    if refsensor == sensor:
        print "auto watering check -----------------------------------------> ", element
        logger.info('auto watering check --------------------------> %s',
                    element)
        # check the watering mode
        modelist = ["None", "Full Auto", "Emergency Activation", "Alert Only"]
        workmode = checkworkmode(element)

        if not (sensor in sensordbmod.gettablelist()):
            print "Sensor does not exist ", sensor, ", element: ", element
            logger.error("Sensor does not exist %s , element: %s ", sensor,
                         element)
            return "sensor not Exist"

        maxthreshold = hardwaremod.tonumber(
            autowateringdbmod.searchdata("element", element, "threshold")[1],
            0)
        minthreshold = hardwaremod.tonumber(
            autowateringdbmod.searchdata("element", element, "threshold")[0],
            maxthreshold)
        # exit condition in case of data inconsistency
        if minthreshold >= maxthreshold:
            print "Data inconsistency , element: ", element
            logger.error("Data inconsistency , element: %s ", element)
            return "data inconsistency"

        now = datetime.now()
        nowtime = now.time()
        starttimeh = hardwaremod.toint(
            autowateringdbmod.searchdata("element", element,
                                         "allowedperiod")[0].split(":")[0], 0)
        starttimem = hardwaremod.toint(
            autowateringdbmod.searchdata("element", element,
                                         "allowedperiod")[0].split(":")[1], 0)
        endtimeh = hardwaremod.toint(
            autowateringdbmod.searchdata("element", element,
                                         "allowedperiod")[1].split(":")[0], 1)
        endtimem = hardwaremod.toint(
            autowateringdbmod.searchdata("element", element,
                                         "allowedperiod")[1].split(":")[1], 0)
        starttime = time(starttimeh, starttimem)
        endtime = time(endtimeh, endtimem)

        duration = 1000 * hardwaremod.toint(
            autowateringdbmod.searchdata("element", element, "wtstepsec"), 0)
        maxstepnumber = hardwaremod.toint(
            autowateringdbmod.searchdata("element", element, "maxstepnumber"),
            0)
        maxdays = hardwaremod.toint(
            autowateringdbmod.searchdata("element", element,
                                         "maxdaysbetweencycles"), 0)
        waitingtime = hardwaremod.toint(
            autowateringdbmod.searchdata("element", element,
                                         "pausebetweenwtstepsmin"), 0)
        mailtype = autowateringdbmod.searchdata("element", element,
                                                "mailalerttype")
        minaccepted = hardwaremod.tonumber(
            autowateringdbmod.searchdata("element", element,
                                         "sensorminacceptedvalue"), 0.1)

        # ------------------------ Workmode split
        if workmode == "Full Auto":
            # block the wateringplan activation as by definition of "Full Auto"
            allowwateringplan[element] = False
            # 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
            logger.info('full auto mode')
            if timeok:
                logger.info('inside allowed time')
                belowthr, valid = checkminthreshold(sensor, minthreshold,
                                                    minaccepted)
                if valid:
                    if belowthr:
                        status = "lowthreshold"
                        logger.info('below threshold')
                        # wait to seek a more stable reading of hygrometer
                        # check if time between watering events is larger that the waiting time (minutes)
                        lastwateringtime = statusdataDBmod.read_status_data(
                            AUTO_data, element, "lastwateringtime")
                        print ' Previous watering: ', lastwateringtime, ' Now: ', datetime.now(
                        )
                        timedifference = sensordbmod.timediffinminutes(
                            lastwateringtime, datetime.now())
                        print 'Time interval between watering steps', timedifference, '. threshold', waitingtime
                        logger.info(
                            'Time interval between watering steps %d threshold %d',
                            timedifference, waitingtime)
                        if timedifference > waitingtime:
                            print " Sufficient waiting time"
                            logger.info('Sufficient waiting time')
                            # activate watering in case the maxstepnumber is not exceeded
                            watercounter = statusdataDBmod.read_status_data(
                                AUTO_data, element, "watercounter")
                            if maxstepnumber > watercounter:
                                #activate pump
                                activatewater(element, duration)
                                # invia mail, considered as info, not as alert
                                if mailtype != "warningonly":
                                    textmessage = "INFO: " + sensor + " value below the minimum threshold " + str(
                                        minthreshold
                                    ) + ", activating the watering :" + element
                                    emailmod.sendallmail("alert", textmessage)
                                statusdataDBmod.write_status_data(
                                    AUTO_data, element, "watercounter",
                                    watercounter + 1)
                                statusdataDBmod.write_status_data(
                                    AUTO_data, element, "lastwateringtime",
                                    datetime.now())
                            else:  # critical, sensor below minimum after all watering activations are done

                                logger.info(
                                    'Number of watering time per cycle has been exceeeded'
                                )
                                # read hystory data and calculate the slope
                                timelist = hardwaremod.gettimedata(sensor)
                                cyclestartdate = statusdataDBmod.read_status_data(
                                    AUTO_data, element, "cyclestartdate")
                                lastwateringtime = statusdataDBmod.read_status_data(
                                    AUTO_data, element, "lastwateringtime")
                                startdate = cyclestartdate - timedelta(
                                    minutes=timelist[1])
                                enddate = lastwateringtime + timedelta(
                                    minutes=waitingtime)
                                isslopeok = checkinclination(
                                    sensor, startdate, enddate
                                )  # still to decide if use the enddate

                                if isslopeok:
                                    # invia mail if couner alert is lower than 1
                                    alertcounter = statusdataDBmod.read_status_data(
                                        AUTO_data, element, "alertcounter")
                                    if alertcounter < 1:
                                        textmessage = "WARNING: Please consider to increase the amount of water per cycle, the " + sensor + " value below the MINIMUM threshold " + str(
                                            minthreshold
                                        ) + " still after activating the watering :" + element + " for " + str(
                                            maxstepnumber
                                        ) + " times. System will automatically reset the watering cycle to allow more water"
                                        print textmessage
                                        #send alert mail notification
                                        emailmod.sendallmail(
                                            "alert", textmessage)
                                        logger.error(textmessage)
                                        statusdataDBmod.write_status_data(
                                            AUTO_data, element, "alertcounter",
                                            alertcounter + 1)

                                    # reset watering cycle
                                    status = "done"
                                    statusdataDBmod.write_status_data(
                                        AUTO_data, element, "watercounter", 0)
                                    statusdataDBmod.write_status_data(
                                        AUTO_data, element, "checkcounter", -1)
                                    statusdataDBmod.write_status_data(
                                        AUTO_data, element, "alertcounter", 0)
                                    statusdataDBmod.write_status_data(
                                        AUTO_data, element, "cyclestartdate",
                                        datetime.now())

                                else:  # slope not OK, probable hardware problem
                                    alertcounter = statusdataDBmod.read_status_data(
                                        AUTO_data, element, "alertcounter")
                                    if alertcounter < 3:
                                        textmessage = "CRITICAL: Possible hardware problem, " + sensor + " value below the MINIMUM threshold " + str(
                                            minthreshold
                                        ) + " still after activating the watering :" + element + " for " + str(
                                            maxstepnumber) + " times"
                                        print textmessage
                                        #send alert mail notification
                                        emailmod.sendallmail(
                                            "alert", textmessage)
                                        logger.error(textmessage)
                                        statusdataDBmod.write_status_data(
                                            AUTO_data, element, "alertcounter",
                                            alertcounter + 1)

                        # update the status
                        checkcounter = statusdataDBmod.read_status_data(
                            AUTO_data, element, "checkcounter")
                        statusdataDBmod.write_status_data(
                            AUTO_data, element, "cyclestatus", status)
                        statusdataDBmod.write_status_data(
                            AUTO_data, element, "checkcounter",
                            checkcounter + 1)

                    # RAMPUP case above threshold but below maxthreshold
                    elif sensorreading(
                            sensor
                    ) < maxthreshold:  # intermediate state where the sensor is above the minthreshold but lower than the max threshold
                        # check the status of the automatic cycle
                        cyclestatus = statusdataDBmod.read_status_data(
                            AUTO_data, element, "cyclestatus")
                        if cyclestatus != "done":
                            status = "rampup"
                            # wait to seek a more stable reading of hygrometer
                            # check if time between watering events is larger that the waiting time (minutes)
                            lastwateringtime = statusdataDBmod.read_status_data(
                                AUTO_data, element, "lastwateringtime")
                            if sensordbmod.timediffinminutes(
                                    lastwateringtime,
                                    datetime.now()) > waitingtime:
                                watercounter = statusdataDBmod.read_status_data(
                                    AUTO_data, element, "watercounter")
                                if maxstepnumber > watercounter:
                                    #activate pump
                                    activatewater(element, duration)
                                    # invia mail, considered as info, not as alert
                                    if mailtype != "warningonly":
                                        textmessage = "INFO: " + sensor + " value below the Maximum threshold " + str(
                                            maxthreshold
                                        ) + ", activating the watering :" + element
                                        emailmod.sendallmail(
                                            "alert", textmessage)

                                    statusdataDBmod.write_status_data(
                                        AUTO_data, element, "watercounter",
                                        watercounter + 1)
                                    statusdataDBmod.write_status_data(
                                        AUTO_data, element, "lastwateringtime",
                                        datetime.now())

                                else:
                                    # give up to reache the maximum threshold, proceed as done, send alert
                                    logger.info(
                                        'Number of watering time per cycle has been exceeeded'
                                    )

                                    # invia mail if couner alert is lower than 1 --------------
                                    # only if the info is activated
                                    if mailtype != "warningonly":
                                        alertcounter = statusdataDBmod.read_status_data(
                                            AUTO_data, element, "alertcounter")
                                        if alertcounter < 2:
                                            textmessage = "INFO " + sensor + " value below the Maximum threshold " + str(
                                                maxthreshold
                                            ) + " still after activating the watering :" + element + " for " + str(
                                                maxstepnumber) + " times"
                                            print textmessage
                                            #send alert mail notification
                                            emailmod.sendallmail(
                                                "alert", textmessage)
                                            logger.error(textmessage)
                                            statusdataDBmod.write_status_data(
                                                AUTO_data, element,
                                                "alertcounter",
                                                alertcounter + 1)

                                    # reset watering cycle
                                    status = "done"
                                    statusdataDBmod.write_status_data(
                                        AUTO_data, element, "watercounter", 0)
                                    statusdataDBmod.write_status_data(
                                        AUTO_data, element, "checkcounter", -1)
                                    statusdataDBmod.write_status_data(
                                        AUTO_data, element, "alertcounter", 0)
                                    statusdataDBmod.write_status_data(
                                        AUTO_data, element, "cyclestartdate",
                                        datetime.now())

                            # update the status
                            checkcounter = statusdataDBmod.read_status_data(
                                AUTO_data, element, "checkcounter")
                            statusdataDBmod.write_status_data(
                                AUTO_data, element, "cyclestatus", status)
                            statusdataDBmod.write_status_data(
                                AUTO_data, element, "checkcounter",
                                checkcounter + 1)

                    else:
                        # update the status, reset cycle
                        statusdataDBmod.write_status_data(
                            AUTO_data, element, "cyclestatus", "done")
                        statusdataDBmod.write_status_data(
                            AUTO_data, element, "checkcounter", 0)
                        statusdataDBmod.write_status_data(
                            AUTO_data, element, "watercounter", 0)
                        statusdataDBmod.write_status_data(
                            AUTO_data, element, "alertcounter", 0)

        elif workmode == "Emergency Activation":
            # check if inside the allow time period
            logger.info('Emergency Mode')
            timeok = isNowInTimePeriod(starttime, endtime, nowtime)
            print "inside allowed time ", timeok, " starttime ", starttime, " endtime ", endtime
            if timeok:
                belowthr, valid = checkminthreshold(sensor, minthreshold,
                                                    minaccepted)
                if valid:
                    if belowthr:
                        # wait to seek a more stable reading of hygrometer
                        # check if time between watering events is larger that the waiting time (minutes)

                        lastwateringtime = statusdataDBmod.read_status_data(
                            AUTO_data, element, "lastwateringtime")
                        if sensordbmod.timediffinminutes(
                                lastwateringtime,
                                datetime.now()) > waitingtime:
                            # activate watering in case the maxstepnumber is not exceeded
                            watercounter = statusdataDBmod.read_status_data(
                                AUTO_data, element, "watercounter")
                            if maxstepnumber > watercounter:
                                #activate pump
                                activatewater(element, duration)
                                # invia mail, considered as info, not as alert
                                if mailtype != "warningonly":
                                    textmessage = "INFO: " + sensor + " value below the minimum threshold " + str(
                                        minthreshold
                                    ) + ", activating the watering :" + element
                                    emailmod.sendallmail("alert", textmessage)

                                statusdataDBmod.write_status_data(
                                    AUTO_data, element, "watercounter",
                                    watercounter + 1)
                                statusdataDBmod.write_status_data(
                                    AUTO_data, element, "lastwateringtime",
                                    datetime.now())

                            else:

                                logger.info(
                                    'Number of watering time per cycle has been exceeeded'
                                )
                                # read hystory data and calculate the slope
                                timelist = hardwaremod.gettimedata(sensor)
                                cyclestartdate = statusdataDBmod.read_status_data(
                                    AUTO_data, element, "cyclestartdate")
                                lastwateringtime = statusdataDBmod.read_status_data(
                                    AUTO_data, element, "lastwateringtime")
                                startdate = cyclestartdate - timedelta(
                                    minutes=timelist[1])
                                enddate = lastwateringtime + timedelta(
                                    minutes=waitingtime)
                                isslopeok = checkinclination(
                                    sensor, startdate, enddate)

                                if isslopeok:
                                    # invia mail if couner alert is lower than 1
                                    alertcounter = statusdataDBmod.read_status_data(
                                        AUTO_data, element, "alertcounter")
                                    if alertcounter < 1:
                                        textmessage = "WARNING: Please consider to increase the amount of water per cycle, the " + sensor + " value below the MINIMUM threshold " + str(
                                            minthreshold
                                        ) + " still after activating the watering :" + element + " for " + str(
                                            maxstepnumber
                                        ) + " times. System will automatically reset the watering cycle to allow more water"
                                        print textmessage
                                        #send alert mail notification alertcounter
                                        emailmod.sendallmail(
                                            "alert", textmessage)
                                        logger.error(textmessage)
                                        statusdataDBmod.write_status_data(
                                            AUTO_data, element, "alertcounter",
                                            alertcounter + 1)

                                    # reset watering cycle
                                    status = "done"
                                    statusdataDBmod.write_status_data(
                                        AUTO_data, element, "watercounter", 0)
                                    statusdataDBmod.write_status_data(
                                        AUTO_data, element, "checkcounter", -1)
                                    statusdataDBmod.write_status_data(
                                        AUTO_data, element, "alertcounter", 0)
                                    statusdataDBmod.write_status_data(
                                        AUTO_data, element, "cyclestartdate",
                                        datetime.now())

                                else:  # slope not OK, probable hardware problem
                                    alertcounter = statusdataDBmod.read_status_data(
                                        AUTO_data, element, "alertcounter")
                                    if alertcounter < 3:
                                        textmessage = "CRITICAL: Possible hardware problem, " + sensor + " value below the MINIMUM threshold " + str(
                                            minthreshold
                                        ) + " still after activating the watering :" + element + " for " + str(
                                            maxstepnumber) + " times"
                                        print textmessage
                                        #send alert mail notification
                                        emailmod.sendallmail(
                                            "alert", textmessage)
                                        logger.error(textmessage)
                                        statusdataDBmod.write_status_data(
                                            AUTO_data, element, "alertcounter",
                                            alertcounter + 1)

                        # update the status
                        checkcounter = statusdataDBmod.read_status_data(
                            AUTO_data, element, "checkcounter")
                        statusdataDBmod.write_status_data(
                            AUTO_data, element, "cyclestatus", "lowthreshold")
                        statusdataDBmod.write_status_data(
                            AUTO_data, element, "checkcounter",
                            checkcounter + 1)
                    else:
                        # update the status
                        statusdataDBmod.write_status_data(
                            AUTO_data, element, "cyclestatus", "done")
                        statusdataDBmod.write_status_data(
                            AUTO_data, element, "checkcounter", 0)
                        statusdataDBmod.write_status_data(
                            AUTO_data, element, "watercounter", 0)
                        statusdataDBmod.write_status_data(
                            AUTO_data, element, "alertcounter", 0)

        elif workmode == "under MIN over MAX":
            logger.info('under MIN over MAX')
            # normally watering plan is allowed unless over MAX threshold
            allowwateringplan[element] = True
            # check if inside the allow time period
            timeok = isNowInTimePeriod(starttime, endtime, nowtime)
            print "inside allowed time ", timeok, " starttime ", starttime, " endtime ", endtime
            if timeok:
                logger.info('Insede operative time')
                belowthr, valid = checkminthreshold(sensor, minthreshold,
                                                    minaccepted)
                if valid:
                    logger.info('valid sensor reading')
                    if belowthr:
                        logger.info('sensor reading below threshold')
                        # wait to seek a more stable reading of hygrometer
                        # check if time between watering events is larger that the waiting time (minutes)

                        lastwateringtime = statusdataDBmod.read_status_data(
                            AUTO_data, element, "lastwateringtime")
                        if sensordbmod.timediffinminutes(
                                lastwateringtime,
                                datetime.now()) > waitingtime:
                            # activate watering in case the maxstepnumber is not exceeded
                            watercounter = statusdataDBmod.read_status_data(
                                AUTO_data, element, "watercounter")
                            if maxstepnumber > watercounter:
                                logger.info('water Count not exceeded')
                                #activate pump
                                activatewater(element, duration)
                                # invia mail, considered as info, not as alert
                                if mailtype != "warningonly":
                                    textmessage = "INFO: " + sensor + " value below the minimum threshold " + str(
                                        minthreshold
                                    ) + ", activating the watering :" + element
                                    emailmod.sendallmail("alert", textmessage)
                                statusdataDBmod.write_status_data(
                                    AUTO_data, element, "watercounter",
                                    watercounter + 1)
                                statusdataDBmod.write_status_data(
                                    AUTO_data, element, "lastwateringtime",
                                    datetime.now())

                            else:

                                logger.info(
                                    'Number of watering time per cycle has been exceeeded'
                                )
                                # read hystory data and calculate the slope
                                timelist = hardwaremod.gettimedata(sensor)

                                cyclestartdate = statusdataDBmod.read_status_data(
                                    AUTO_data, element, "cyclestartdate")
                                lastwateringtime = statusdataDBmod.read_status_data(
                                    AUTO_data, element, "lastwateringtime")
                                startdate = cyclestartdate - timedelta(
                                    minutes=timelist[1])
                                enddate = lastwateringtime + timedelta(
                                    minutes=waitingtime)
                                isslopeok = checkinclination(
                                    sensor, startdate, enddate)

                                if isslopeok:
                                    # invia mail if couner alert is lower than 1
                                    alertcounter = statusdataDBmod.read_status_data(
                                        AUTO_data, element, "alertcounter")
                                    if alertcounter < 1:
                                        textmessage = "WARNING: Please consider to increase the amount of water per cycle, the " + sensor + " value below the MINIMUM threshold " + str(
                                            minthreshold
                                        ) + " still after activating the watering :" + element + " for " + str(
                                            maxstepnumber
                                        ) + " times. System will automatically reset the watering cycle to allow more water"
                                        print textmessage
                                        #send alert mail notification
                                        emailmod.sendallmail(
                                            "alert", textmessage)
                                        logger.error(textmessage)
                                        statusdataDBmod.write_status_data(
                                            AUTO_data, element, "alertcounter",
                                            alertcounter + 1)

                                    # reset watering cycle
                                    status = "done"
                                    statusdataDBmod.write_status_data(
                                        AUTO_data, element, "watercounter", 0)
                                    statusdataDBmod.write_status_data(
                                        AUTO_data, element, "checkcounter", -1)
                                    statusdataDBmod.write_status_data(
                                        AUTO_data, element, "alertcounter", 0)
                                    statusdataDBmod.write_status_data(
                                        AUTO_data, element, "cyclestartdate",
                                        datetime.now())

                                else:  # slope not OK, probable hardware problem
                                    alertcounter = statusdataDBmod.read_status_data(
                                        AUTO_data, element, "alertcounter")
                                    if alertcounter < 3:
                                        textmessage = "CRITICAL: Possible hardware problem, " + sensor + " value below the MINIMUM threshold " + str(
                                            minthreshold
                                        ) + " still after activating the watering :" + element + " for " + str(
                                            maxstepnumber) + " times"
                                        print textmessage
                                        #send alert mail notification
                                        emailmod.sendallmail(
                                            "alert", textmessage)
                                        logger.error(textmessage)
                                        statusdataDBmod.write_status_data(
                                            AUTO_data, element, "alertcounter",
                                            alertcounter + 1)

                        # update the status
                        checkcounter = statusdataDBmod.read_status_data(
                            AUTO_data, element, "checkcounter")
                        statusdataDBmod.write_status_data(
                            AUTO_data, element, "cyclestatus", "lowthreshold")
                        statusdataDBmod.write_status_data(
                            AUTO_data, element, "checkcounter",
                            checkcounter + 1)

                    else:  # above minimum threshold
                        logger.info('sensor reading above min threshold')
                        # update the status
                        statusdataDBmod.write_status_data(
                            AUTO_data, element, "cyclestatus", "done")
                        statusdataDBmod.write_status_data(
                            AUTO_data, element, "checkcounter", 0)
                        statusdataDBmod.write_status_data(
                            AUTO_data, element, "watercounter", 0)
                        statusdataDBmod.write_status_data(
                            AUTO_data, element, "alertcounter", 0)

                        if sensorreading(sensor) > maxthreshold:
                            logger.info(
                                'sensor reading above MAX threshold, deactivate scheduled irrigation'
                            )
                            # do not activate the irrigation scheduled in the time plan
                            allowwateringplan[element] = False

        elif workmode == "Alert Only":
            belowthr, valid = checkminthreshold(sensor, minthreshold,
                                                minaccepted)
            if valid:
                if belowthr:
                    # invia mail if couter alert is lower than
                    alertcounter = statusdataDBmod.read_status_data(
                        AUTO_data, element, "alertcounter")
                    if alertcounter < 2:
                        textmessage = "WARNING " + sensor + " value below the minimum threshold " + str(
                            minthreshold) + " watering system: " + element
                        print textmessage
                        #send alert mail notification
                        emailmod.sendallmail("alert", textmessage)
                        logger.error(textmessage)
                        statusdataDBmod.write_status_data(
                            AUTO_data, element, "alertcounter",
                            alertcounter + 1)
                    # update the status
                    checkcounter = statusdataDBmod.read_status_data(
                        AUTO_data, element, "checkcounter")
                    statusdataDBmod.write_status_data(AUTO_data, element,
                                                      "cyclestatus",
                                                      "lowthreshold")
                    statusdataDBmod.write_status_data(AUTO_data, element,
                                                      "checkcounter",
                                                      checkcounter + 1)
                else:
                    # update the status
                    statusdataDBmod.write_status_data(AUTO_data, element,
                                                      "cyclestatus", "done")
                    statusdataDBmod.write_status_data(AUTO_data, element,
                                                      "checkcounter", 0)
                    statusdataDBmod.write_status_data(AUTO_data, element,
                                                      "watercounter", 0)
                    statusdataDBmod.write_status_data(AUTO_data, element,
                                                      "alertcounter", 0)

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

        cyclestatus = statusdataDBmod.read_status_data(AUTO_data, element,
                                                       "cyclestatus")
        if cyclestatus == "lowthreshold":
            checkcounter = statusdataDBmod.read_status_data(
                AUTO_data, element, "checkcounter")
            if checkcounter == 1:
                statusdataDBmod.write_status_data(AUTO_data, element,
                                                  "cyclestartdate",
                                                  datetime.now())

        # implment alert message for the cycle exceeding days, and reset the cycle
        if workmode != "None":
            cyclestartdate = statusdataDBmod.read_status_data(
                AUTO_data, element, "cyclestartdate")
            timedeltadays = sensordbmod.timediffdays(datetime.now(),
                                                     cyclestartdate)
            if (timedeltadays > maxdays
                ):  #the upper limit is set in case of abrupt time change
                textmessage = "WARNING " + sensor + " watering cycle is taking too many days, watering system: " + element + ". Reset watering cycle"
                print textmessage
                # in case of full Auto, activate pump for minimum pulse period
                if workmode == "Full Auto":
                    if (
                            timedeltadays < maxdays + 2
                    ):  #the upper limit is set in case of abrupt time change
                        textmessage = "WARNING " + sensor + " watering cycle is taking too many days, watering system: " + element + ". Activate Min pulse + Reset watering cycle"
                        activatewater(element, duration)
                #send alert mail notification
                if mailtype != "warningonly":
                    emailmod.sendallmail("alert", textmessage)
                logger.error(textmessage)
                logger.error("Cycle started %s, Now is %s ",
                             cyclestartdate.strftime("%Y-%m-%d %H:%M:%S"),
                             datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
                # reset cycle
                statusdataDBmod.write_status_data(AUTO_data, element,
                                                  "cyclestatus", "done")
                statusdataDBmod.write_status_data(AUTO_data, element,
                                                  "checkcounter", 0)
                statusdataDBmod.write_status_data(AUTO_data, element,
                                                  "watercounter", 0)
                statusdataDBmod.write_status_data(AUTO_data, element,
                                                  "alertcounter", 0)
                statusdataDBmod.write_status_data(AUTO_data, element,
                                                  "cyclestartdate",
                                                  datetime.now())

        # implment Critical alert message in case the threshold is below the 0.5 of the minimum
        if workmode != "None":
            belowthr, valid = checkminthreshold(sensor, minthreshold * 0.5,
                                                minaccepted)
            if valid:
                if belowthr:
                    logger.info(
                        'sensor %s below half of the actual set threshold',
                        sensor)
                    textmessage = "CRITICAL: Plant is dying, " + sensor + " reading below half of the minimum threshold, need to check the " + element
                    print textmessage
                    #send alert mail notification
                    alertcounter = statusdataDBmod.read_status_data(
                        AUTO_data, element, "alertcounter")
                    if alertcounter < 5:
                        emailmod.sendallmail("alert", textmessage)
                        logger.error(textmessage)
                        statusdataDBmod.write_status_data(
                            AUTO_data, element, "alertcounter",
                            alertcounter + 1)
            else:
                logger.info('sensor %s below valid data', sensor)
                textmessage = "WARNING: " + sensor + " below valid data range, need to check sensor"
                print textmessage
                #send alert mail notification
                alertcounter = statusdataDBmod.read_status_data(
                    AUTO_data, element, "alertcounter")
                if alertcounter < 3:
                    emailmod.sendallmail("alert", textmessage)
                    logger.error(textmessage)
                    statusdataDBmod.write_status_data(AUTO_data, element,
                                                      "alertcounter",
                                                      alertcounter + 1)
    return
コード例 #8
0
ファイル: selectedplanmod.py プロジェクト: Hydrosys4/Master
def startpump(target,activationseconds,MinAveragetemp,MaxAverageHumid):

	logger.info('WateringPlan Startpump evaluation: %s', target)	
	#workmode=autowateringmod.checkworkmode(target)
	#if workmode=="Full Auto":
	if target in autowateringmod.allowwateringplan:
		if not autowateringmod.allowwateringplan[target]:
			logger.info('WateringPlan: %s pump activation blocked by automation', target)
			pumpit=False
			return False
	
	duration=1000*hardwaremod.toint(activationseconds,0)
	print target, " ",duration, " " , datetime.now() 

	# evaluate parameters
	#MinAverageLight=500 not used now
	MinutesOfAverage=120 #minutes in which the average data is calculated from sensor sampling

	print "waterpump check"
	logger.info('execute water pump check %s', datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

	# then check the temperature and Humidity

	print "Check Humidity and Temperature"
	
	MinAveragetempnum=hardwaremod.tonumber(MinAveragetemp,"NA")
	MaxAverageHumidnum=hardwaremod.tonumber(MaxAverageHumid,"NA")
	
	# all the below conditions should be verified to start the PUMP
	pumpit=True	
	
	hsensornamelist=hardwaremod.getsensornamebymeasure(hardwaremod.MEASURELIST[1])
	if hsensornamelist:
		sensordata=[]		
		hsensorname=hsensornamelist[0]  # get first found sensor in the list
		sensordbmod.getsensordbdata(hsensorname,sensordata)
		starttimecalc=datetime.now()-timedelta(minutes=int(MinutesOfAverage))
		humquantity=sensordbmod.EvaluateDataPeriod(sensordata,starttimecalc,datetime.now())["average"]	
		logger.info('Waterpump Check parameter if humquantity=%s < MaxAverageHumid=%s ', str(humquantity), str(MaxAverageHumid))
		print 'Waterpump Check parameter if humquantity=',humquantity,' < MaxAverageHumid=' ,MaxAverageHumid
		
		if (MaxAverageHumidnum!="NA"):
			if (humquantity<MaxAverageHumidnum):		
				logger.info('Humidity check PASSED, humquantity=%s < MaxAverageHumid=%s ', str(humquantity), str(MaxAverageHumid))			
			else:
				logger.info('Humidity check FAILED')
				print 'Humidity check FAILED'
				pumpit=False			
		
	
	tsensornamelist=hardwaremod.getsensornamebymeasure(hardwaremod.MEASURELIST[0])
	if tsensornamelist:
		sensordata=[]		
		tsensorname=tsensornamelist[0]  # get first found sensor in the list
		sensordbmod.getsensordbdata(tsensorname,sensordata)
		starttimecalc=datetime.now()-timedelta(minutes=int(MinutesOfAverage))
		tempquantity=sensordbmod.EvaluateDataPeriod(sensordata,starttimecalc,datetime.now())["average"]	
		logger.info('Waterpump Check parameter if tempquantity=%s > MinAveragetemp=%s ', str(tempquantity), str(MinAveragetemp))
		print 'Waterpump Check parameter if tempquantity=',tempquantity,' > MinAveragetemp=' ,MinAveragetemp
		
		if (MinAveragetempnum!="NA"):
			if (tempquantity>MinAveragetempnum):		
				logger.info('Temperature check PASSED, tempquantity=%s > MinAveragetemp=%s ', str(tempquantity), str(MinAveragetemp))			
			else:
				logger.info('Temperature check FAILED')
				print 'Temperature check FAILED'
				pumpit=False	
				

	if pumpit:
		# activation of the doser before the pump
		doseron=autofertilizermod.checkactivate(target,duration)	
		# watering
		hardwaremod.makepulse(target,duration)
		# salva su database
		logger.info('Switch Pump %s ON, optional time for sec = %s', target, duration)
		print 'Pump ON, optional time for sec =', duration
		actuatordbmod.insertdataintable(target,duration)
		
	return True
コード例 #9
0
def startpump(target, activationseconds, MinAveragetemp, MaxAverageHumid):

    logger.info('WateringPlan Startpump evaluation: %s', target)
    #workmode=autowateringmod.checkworkmode(target)
    #if workmode=="Full Auto":
    if target in autowateringmod.allowwateringplan:
        if not autowateringmod.allowwateringplan[target]:
            logger.info(
                'WateringPlan: %s pump activation blocked by automation',
                target)
            pumpit = False
            return False

    duration = hardwaremod.toint(activationseconds, 0)
    print target, " ", duration, " ", datetime.now()

    # evaluate parameters
    #MinAverageLight=500 not used now
    MinutesOfAverage = 120  #minutes in which the average data is calculated from sensor sampling

    print "waterpump check"
    logger.info('execute water pump check %s',
                datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

    # then check the temperature and Humidity

    print "Check Humidity and Temperature"

    MinAveragetempnum = hardwaremod.tonumber(MinAveragetemp, "NA")
    MaxAverageHumidnum = hardwaremod.tonumber(MaxAverageHumid, "NA")

    # all the below conditions should be verified to start the PUMP
    pumpit = True

    hsensornamelist = hardwaremod.getsensornamebymeasure(
        hardwaremod.MEASURELIST[1])
    if hsensornamelist:
        sensordata = []
        hsensorname = hsensornamelist[0]  # get first found sensor in the list
        sensordbmod.getsensordbdata(hsensorname, sensordata)
        starttimecalc = datetime.now() - timedelta(
            minutes=int(MinutesOfAverage))
        isok, quantitylist = sensordbmod.EvaluateDataPeriod(
            sensordata, starttimecalc, datetime.now())
        humquantity = quantitylist["average"]

        logger.info(
            'Waterpump Check parameter if humquantity=%s < MaxAverageHumid=%s ',
            str(humquantity), str(MaxAverageHumid))
        print 'Waterpump Check parameter if humquantity=', humquantity, ' < MaxAverageHumid=', MaxAverageHumid

        if (MaxAverageHumidnum != "NA"):
            if (humquantity < MaxAverageHumidnum):
                logger.info(
                    'Humidity check PASSED, humquantity=%s < MaxAverageHumid=%s ',
                    str(humquantity), str(MaxAverageHumid))
            else:
                logger.info('Humidity check FAILED')
                print 'Humidity check FAILED'
                pumpit = False

    tsensornamelist = hardwaremod.getsensornamebymeasure(
        hardwaremod.MEASURELIST[0])
    if tsensornamelist:
        sensordata = []
        tsensorname = tsensornamelist[0]  # get first found sensor in the list
        sensordbmod.getsensordbdata(tsensorname, sensordata)
        starttimecalc = datetime.now() - timedelta(
            minutes=int(MinutesOfAverage))
        isok, quantitylist = sensordbmod.EvaluateDataPeriod(
            sensordata, starttimecalc, datetime.now())
        tempquantity = quantitylist["average"]
        logger.info(
            'Waterpump Check parameter if tempquantity=%s > MinAveragetemp=%s ',
            str(tempquantity), str(MinAveragetemp))
        print 'Waterpump Check parameter if tempquantity=', tempquantity, ' > MinAveragetemp=', MinAveragetemp

        if (MinAveragetempnum != "NA"):
            if (tempquantity > MinAveragetempnum):
                logger.info(
                    'Temperature check PASSED, tempquantity=%s > MinAveragetemp=%s ',
                    str(tempquantity), str(MinAveragetemp))
            else:
                logger.info('Temperature check FAILED')
                print 'Temperature check FAILED'
                pumpit = False

    if pumpit:
        # activation of the doser before the pump
        doseron = autofertilizermod.checkactivate(target, duration)
        # watering
        hardwaremod.makepulse(target, duration)
        # salva su database
        logger.info('Switch Pump %s ON, optional time for sec = %s', target,
                    duration)
        print 'Pump ON, optional time for sec =', duration
        actuatordbmod.insertdataintable(target, duration)

    return True
コード例 #10
0
ファイル: automationmod.py プロジェクト: Hydrosys4/Master
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
コード例 #11
0
ファイル: autowateringmod.py プロジェクト: Hydrosys4/Master
def autowateringexecute(refsensor,element):	
	global AUTO_data
	sensor=autowateringdbmod.searchdata("element",element,"sensor")	
	# check the sensor
	if refsensor==sensor:	
		print "auto watering check -----------------------------------------> ", element
		logger.info('auto watering check --------------------------> %s', element)
		# check the watering mode
		modelist=["None", "Full Auto" , "Emergency Activation" , "Alert Only"]
		workmode=checkworkmode(element)

		if not(sensor in sensordbmod.gettablelist()):
			print "Sensor does not exist " ,sensor , ", element: " , element
			logger.error("Sensor does not exist %s , element: %s " ,sensor, element)			
			return "sensor not Exist"
		
		maxthreshold=hardwaremod.tonumber(autowateringdbmod.searchdata("element",element,"threshold")[1],0)
		minthreshold=hardwaremod.tonumber(autowateringdbmod.searchdata("element",element,"threshold")[0],maxthreshold)
		# exit condition in case of data inconsistency
		if minthreshold>=maxthreshold:
			print "Data inconsistency , element: " , element
			logger.error("Data inconsistency , element: %s " , element)
			return "data inconsistency"
		
		now = datetime.now()
		nowtime = now.time()
		starttimeh=hardwaremod.toint(autowateringdbmod.searchdata("element",element,"allowedperiod")[0].split(":")[0],0)
		starttimem=hardwaremod.toint(autowateringdbmod.searchdata("element",element,"allowedperiod")[0].split(":")[1],0)
		endtimeh=hardwaremod.toint(autowateringdbmod.searchdata("element",element,"allowedperiod")[1].split(":")[0],1)
		endtimem=hardwaremod.toint(autowateringdbmod.searchdata("element",element,"allowedperiod")[1].split(":")[1],0)
		starttime=time(starttimeh,starttimem)
		endtime=time(endtimeh,endtimem)		
		
		duration=1000*hardwaremod.toint(autowateringdbmod.searchdata("element",element,"wtstepsec"),0)
		maxstepnumber=hardwaremod.toint(autowateringdbmod.searchdata("element",element,"maxstepnumber"),0)
		maxdays=hardwaremod.toint(autowateringdbmod.searchdata("element",element,"maxdaysbetweencycles"),0)
		waitingtime=hardwaremod.toint(autowateringdbmod.searchdata("element",element,"pausebetweenwtstepsmin"),0)
		mailtype=autowateringdbmod.searchdata("element",element,"mailalerttype")
		minaccepted=hardwaremod.tonumber(autowateringdbmod.searchdata("element",element,"sensorminacceptedvalue"),0.1)
		
		# ------------------------ Workmode split
		if workmode=="Full Auto":
			# block the wateringplan activation as by definition of "Full Auto"
			allowwateringplan[element]=False
			# 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
			logger.info('full auto mode')
			if timeok:
				logger.info('inside allowed time')
				belowthr,valid=checkminthreshold(sensor,minthreshold,minaccepted)
				if valid:
					if belowthr:
						status="lowthreshold"
						logger.info('below threshold')
						# wait to seek a more stable reading of hygrometer
						# check if time between watering events is larger that the waiting time (minutes)
						lastwateringtime=statusdataDBmod.read_status_data(AUTO_data,element,"lastwateringtime")
						print ' Previous watering: ' , lastwateringtime , ' Now: ', datetime.now()
						timedifference=sensordbmod.timediffinminutes(lastwateringtime,datetime.now())
						print 'Time interval between watering steps', timedifference ,'. threshold', waitingtime
						logger.info('Time interval between watering steps %d threshold %d', timedifference,waitingtime)		
						if timedifference>waitingtime:
							print " Sufficient waiting time"
							logger.info('Sufficient waiting time')	
							# activate watering in case the maxstepnumber is not exceeded	
							watercounter=statusdataDBmod.read_status_data(AUTO_data,element,"watercounter")				
							if maxstepnumber>watercounter:
								#activate pump		
								activatewater(element, duration)
								# invia mail, considered as info, not as alert
								if mailtype!="warningonly":
									textmessage="INFO: " + sensor + " value below the minimum threshold " + str(minthreshold) + ", activating the watering :" + element
									emailmod.sendallmail("alert", textmessage)
								statusdataDBmod.write_status_data(AUTO_data,element,"watercounter",watercounter+1)
								statusdataDBmod.write_status_data(AUTO_data,element,"lastwateringtime",datetime.now())								
							else: # critical, sensor below minimum after all watering activations are done

								logger.info('Number of watering time per cycle has been exceeeded')
								# read hystory data and calculate the slope
								timelist=hardwaremod.gettimedata(sensor)
								cyclestartdate=statusdataDBmod.read_status_data(AUTO_data,element,"cyclestartdate")	
								lastwateringtime=statusdataDBmod.read_status_data(AUTO_data,element,"lastwateringtime")
								startdate=cyclestartdate - timedelta(minutes=timelist[1])
								enddate=lastwateringtime + timedelta(minutes=waitingtime)
								isslopeok=checkinclination(sensor,startdate,enddate) # still to decide if use the enddate 
								
								if isslopeok:
									# invia mail if couner alert is lower than 1
									alertcounter=statusdataDBmod.read_status_data(AUTO_data,element,"alertcounter")
									if alertcounter<1:
										textmessage="WARNING: Please consider to increase the amount of water per cycle, the "+ sensor + " value below the MINIMUM threshold " + str(minthreshold) + " still after activating the watering :" + element + " for " + str(maxstepnumber) + " times. System will automatically reset the watering cycle to allow more water"
										print textmessage
										#send alert mail notification
										emailmod.sendallmail("alert", textmessage)							
										logger.error(textmessage)
										statusdataDBmod.write_status_data(AUTO_data,element,"alertcounter",alertcounter+1)
										
									# reset watering cycle
									status="done"
									statusdataDBmod.write_status_data(AUTO_data,element,"watercounter",0)
									statusdataDBmod.write_status_data(AUTO_data,element,"checkcounter",-1)
									statusdataDBmod.write_status_data(AUTO_data,element,"alertcounter",0)
									statusdataDBmod.write_status_data(AUTO_data,element,"cyclestartdate",datetime.now())
																			
								else: # slope not OK, probable hardware problem
									alertcounter=statusdataDBmod.read_status_data(AUTO_data,element,"alertcounter")
									if alertcounter<3:
										textmessage="CRITICAL: Possible hardware problem, "+ sensor + " value below the MINIMUM threshold " + str(minthreshold) + " still after activating the watering :" + element + " for " + str(maxstepnumber) + " times"
										print textmessage
										#send alert mail notification
										emailmod.sendallmail("alert", textmessage)							
										logger.error(textmessage)										
										statusdataDBmod.write_status_data(AUTO_data,element,"alertcounter",alertcounter+1)
									
											
						# update the status
						checkcounter=statusdataDBmod.read_status_data(AUTO_data,element,"checkcounter")
						statusdataDBmod.write_status_data(AUTO_data,element,"cyclestatus",status)
						statusdataDBmod.write_status_data(AUTO_data,element,"checkcounter",checkcounter+1)
						
					# RAMPUP case above threshold but below maxthreshold
					elif sensorreading(sensor)<maxthreshold: # intermediate state where the sensor is above the minthreshold but lower than the max threshold
						# check the status of the automatic cycle
						cyclestatus=statusdataDBmod.read_status_data(AUTO_data,element,"cyclestatus")
						if cyclestatus!="done":
							status="rampup"							
							# wait to seek a more stable reading of hygrometer
							# check if time between watering events is larger that the waiting time (minutes)
							lastwateringtime=statusdataDBmod.read_status_data(AUTO_data,element,"lastwateringtime")			
							if sensordbmod.timediffinminutes(lastwateringtime,datetime.now())>waitingtime:
								watercounter=statusdataDBmod.read_status_data(AUTO_data,element,"watercounter")
								if maxstepnumber>watercounter:
									#activate pump		
									activatewater(element, duration)
									# invia mail, considered as info, not as alert
									if mailtype!="warningonly":
										textmessage="INFO: " + sensor + " value below the Maximum threshold " + str(maxthreshold) + ", activating the watering :" + element
										emailmod.sendallmail("alert", textmessage)
										
									statusdataDBmod.write_status_data(AUTO_data,element,"watercounter",watercounter+1)
									statusdataDBmod.write_status_data(AUTO_data,element,"lastwateringtime",datetime.now())										

								else:
									# give up to reache the maximum threshold, proceed as done, send alert
									logger.info('Number of watering time per cycle has been exceeeded')
									
									# invia mail if couner alert is lower than 1 --------------
									# only if the info is activated
									if mailtype!="warningonly":
										alertcounter=statusdataDBmod.read_status_data(AUTO_data,element,"alertcounter")	
										if alertcounter<2:
											textmessage="INFO "+ sensor + " value below the Maximum threshold " + str(maxthreshold) + " still after activating the watering :" + element + " for " + str(maxstepnumber) + " times"
											print textmessage
											#send alert mail notification
											emailmod.sendallmail("alert", textmessage)							
											logger.error(textmessage)	
											statusdataDBmod.write_status_data(AUTO_data,element,"alertcounter",alertcounter+1)								
									
									# reset watering cycle					
									status="done"	
									statusdataDBmod.write_status_data(AUTO_data,element,"watercounter",0)
									statusdataDBmod.write_status_data(AUTO_data,element,"checkcounter",-1)
									statusdataDBmod.write_status_data(AUTO_data,element,"alertcounter",0)
									statusdataDBmod.write_status_data(AUTO_data,element,"cyclestartdate",datetime.now())

																	

							# update the status							
							checkcounter=statusdataDBmod.read_status_data(AUTO_data,element,"checkcounter")
							statusdataDBmod.write_status_data(AUTO_data,element,"cyclestatus",status)
							statusdataDBmod.write_status_data(AUTO_data,element,"checkcounter",checkcounter+1)
					
					else:
						# update the status, reset cycle
						statusdataDBmod.write_status_data(AUTO_data,element,"cyclestatus","done")
						statusdataDBmod.write_status_data(AUTO_data,element,"checkcounter",0)
						statusdataDBmod.write_status_data(AUTO_data,element,"watercounter",0)
						statusdataDBmod.write_status_data(AUTO_data,element,"alertcounter",0)														
			
			
		elif workmode=="Emergency Activation":
			# check if inside the allow time period
			logger.info('Emergency Mode')
			timeok=isNowInTimePeriod(starttime, endtime, nowtime)
			print "inside allowed time ", timeok , " starttime ", starttime , " endtime ", endtime
			if timeok:			
				belowthr,valid=checkminthreshold(sensor,minthreshold,minaccepted)
				if valid:
					if belowthr:
						# wait to seek a more stable reading of hygrometer
						# check if time between watering events is larger that the waiting time (minutes)
						
						lastwateringtime=statusdataDBmod.read_status_data(AUTO_data,element,"lastwateringtime")			
						if sensordbmod.timediffinminutes(lastwateringtime,datetime.now())>waitingtime:
							# activate watering in case the maxstepnumber is not exceeded			
							watercounter=statusdataDBmod.read_status_data(AUTO_data,element,"watercounter")		
							if maxstepnumber>watercounter:			
								#activate pump		
								activatewater(element, duration)
								# invia mail, considered as info, not as alert
								if mailtype!="warningonly":
									textmessage="INFO: " + sensor + " value below the minimum threshold " + str(minthreshold) + ", activating the watering :" + element
									emailmod.sendallmail("alert", textmessage)

								statusdataDBmod.write_status_data(AUTO_data,element,"watercounter",watercounter+1)
								statusdataDBmod.write_status_data(AUTO_data,element,"lastwateringtime",datetime.now())									
								
								
							else:

								logger.info('Number of watering time per cycle has been exceeeded')
								# read hystory data and calculate the slope
								timelist=hardwaremod.gettimedata(sensor)
								cyclestartdate=statusdataDBmod.read_status_data(AUTO_data,element,"cyclestartdate")	
								lastwateringtime=statusdataDBmod.read_status_data(AUTO_data,element,"lastwateringtime")	
								startdate=cyclestartdate - timedelta(minutes=timelist[1])
								enddate=lastwateringtime + timedelta(minutes=waitingtime)
								isslopeok=checkinclination(sensor,startdate,enddate)
								
								if isslopeok:
									# invia mail if couner alert is lower than 1
									alertcounter=statusdataDBmod.read_status_data(AUTO_data,element,"alertcounter")
									if alertcounter<1:
										textmessage="WARNING: Please consider to increase the amount of water per cycle, the "+ sensor + " value below the MINIMUM threshold " + str(minthreshold) + " still after activating the watering :" + element + " for " + str(maxstepnumber) + " times. System will automatically reset the watering cycle to allow more water"
										print textmessage
										#send alert mail notification alertcounter
										emailmod.sendallmail("alert", textmessage)							
										logger.error(textmessage)
										statusdataDBmod.write_status_data(AUTO_data,element,"alertcounter",alertcounter+1)
										
									# reset watering cycle
									status="done"
									statusdataDBmod.write_status_data(AUTO_data,element,"watercounter",0)
									statusdataDBmod.write_status_data(AUTO_data,element,"checkcounter",-1)
									statusdataDBmod.write_status_data(AUTO_data,element,"alertcounter",0)
									statusdataDBmod.write_status_data(AUTO_data,element,"cyclestartdate",datetime.now())
																			
								else: # slope not OK, probable hardware problem
									alertcounter=statusdataDBmod.read_status_data(AUTO_data,element,"alertcounter")
									if alertcounter<3:
										textmessage="CRITICAL: Possible hardware problem, "+ sensor + " value below the MINIMUM threshold " + str(minthreshold) + " still after activating the watering :" + element + " for " + str(maxstepnumber) + " times"
										print textmessage
										#send alert mail notification
										emailmod.sendallmail("alert", textmessage)							
										logger.error(textmessage)
										statusdataDBmod.write_status_data(AUTO_data,element,"alertcounter",alertcounter+1)			
		
									
						# update the status
						checkcounter=statusdataDBmod.read_status_data(AUTO_data,element,"checkcounter")
						statusdataDBmod.write_status_data(AUTO_data,element,"cyclestatus","lowthreshold")
						statusdataDBmod.write_status_data(AUTO_data,element,"checkcounter",checkcounter+1)
					else:
						# update the status		
						statusdataDBmod.write_status_data(AUTO_data,element,"cyclestatus","done")
						statusdataDBmod.write_status_data(AUTO_data,element,"checkcounter",0)
						statusdataDBmod.write_status_data(AUTO_data,element,"watercounter",0)
						statusdataDBmod.write_status_data(AUTO_data,element,"alertcounter",0)		
	
			
		elif workmode=="under MIN over MAX":
			logger.info('under MIN over MAX')
			# normally watering plan is allowed unless over MAX threshold
			allowwateringplan[element]=True
			# check if inside the allow time period
			timeok=isNowInTimePeriod(starttime, endtime, nowtime)
			print "inside allowed time ", timeok , " starttime ", starttime , " endtime ", endtime
			if timeok:			
				logger.info('Insede operative time')
				belowthr,valid=checkminthreshold(sensor,minthreshold,minaccepted)
				if valid:
					logger.info('valid sensor reading')
					if belowthr:
						logger.info('sensor reading below threshold')
						# wait to seek a more stable reading of hygrometer
						# check if time between watering events is larger that the waiting time (minutes)			

						lastwateringtime=statusdataDBmod.read_status_data(AUTO_data,element,"lastwateringtime")			
						if sensordbmod.timediffinminutes(lastwateringtime,datetime.now())>waitingtime:
							# activate watering in case the maxstepnumber is not exceeded			
							watercounter=statusdataDBmod.read_status_data(AUTO_data,element,"watercounter")		
							if maxstepnumber>watercounter:
								logger.info('water Count not exceeded')			
								#activate pump		
								activatewater(element, duration)
								# invia mail, considered as info, not as alert
								if mailtype!="warningonly":
									textmessage="INFO: " + sensor + " value below the minimum threshold " + str(minthreshold) + ", activating the watering :" + element
									emailmod.sendallmail("alert", textmessage)								
								statusdataDBmod.write_status_data(AUTO_data,element,"watercounter",watercounter+1)
								statusdataDBmod.write_status_data(AUTO_data,element,"lastwateringtime",datetime.now())	
								
								
							else:

								logger.info('Number of watering time per cycle has been exceeeded')
								# read hystory data and calculate the slope
								timelist=hardwaremod.gettimedata(sensor)
								
								cyclestartdate=statusdataDBmod.read_status_data(AUTO_data,element,"cyclestartdate")	
								lastwateringtime=statusdataDBmod.read_status_data(AUTO_data,element,"lastwateringtime")
								startdate=cyclestartdate - timedelta(minutes=timelist[1])
								enddate=lastwateringtime + timedelta(minutes=waitingtime)
								isslopeok=checkinclination(sensor,startdate,enddate)
								
								if isslopeok:
									# invia mail if couner alert is lower than 1
									alertcounter=statusdataDBmod.read_status_data(AUTO_data,element,"alertcounter")
									if alertcounter<1:
										textmessage="WARNING: Please consider to increase the amount of water per cycle, the "+ sensor + " value below the MINIMUM threshold " + str(minthreshold) + " still after activating the watering :" + element + " for " + str(maxstepnumber) + " times. System will automatically reset the watering cycle to allow more water"
										print textmessage
										#send alert mail notification
										emailmod.sendallmail("alert", textmessage)							
										logger.error(textmessage)
										statusdataDBmod.write_status_data(AUTO_data,element,"alertcounter",alertcounter+1)
										
									# reset watering cycle
									status="done"
									statusdataDBmod.write_status_data(AUTO_data,element,"watercounter",0)
									statusdataDBmod.write_status_data(AUTO_data,element,"checkcounter",-1)
									statusdataDBmod.write_status_data(AUTO_data,element,"alertcounter",0)
									statusdataDBmod.write_status_data(AUTO_data,element,"cyclestartdate",datetime.now())
																			
								else: # slope not OK, probable hardware problem
									alertcounter=statusdataDBmod.read_status_data(AUTO_data,element,"alertcounter")
									if alertcounter<3:
										textmessage="CRITICAL: Possible hardware problem, "+ sensor + " value below the MINIMUM threshold " + str(minthreshold) + " still after activating the watering :" + element + " for " + str(maxstepnumber) + " times"
										print textmessage
										#send alert mail notification
										emailmod.sendallmail("alert", textmessage)							
										logger.error(textmessage)
										statusdataDBmod.write_status_data(AUTO_data,element,"alertcounter",alertcounter+1)			
		
									
						# update the status
						checkcounter=statusdataDBmod.read_status_data(AUTO_data,element,"checkcounter")
						statusdataDBmod.write_status_data(AUTO_data,element,"cyclestatus","lowthreshold")
						statusdataDBmod.write_status_data(AUTO_data,element,"checkcounter",checkcounter+1)
						
					else: # above minimum threshold
						logger.info('sensor reading above min threshold')
						# update the status
						statusdataDBmod.write_status_data(AUTO_data,element,"cyclestatus","done")
						statusdataDBmod.write_status_data(AUTO_data,element,"checkcounter",0)
						statusdataDBmod.write_status_data(AUTO_data,element,"watercounter",0)
						statusdataDBmod.write_status_data(AUTO_data,element,"alertcounter",0)		
						
						if sensorreading(sensor)>maxthreshold:
							logger.info('sensor reading above MAX threshold, deactivate scheduled irrigation')
							# do not activate the irrigation scheduled in the time plan
							allowwateringplan[element]=False
							
						

		elif workmode=="Alert Only":
			belowthr,valid=checkminthreshold(sensor,minthreshold,minaccepted)
			if valid:
				if belowthr:
					# invia mail if couter alert is lower than
					alertcounter=statusdataDBmod.read_status_data(AUTO_data,element,"alertcounter")	
					if alertcounter<2:
						textmessage="WARNING "+ sensor + " value below the minimum threshold " + str(minthreshold) + " watering system: " + element
						print textmessage
						#send alert mail notification
						emailmod.sendallmail("alert", textmessage)							
						logger.error(textmessage)
						statusdataDBmod.write_status_data(AUTO_data,element,"alertcounter",alertcounter+1)
					# update the status
					checkcounter=statusdataDBmod.read_status_data(AUTO_data,element,"checkcounter")
					statusdataDBmod.write_status_data(AUTO_data,element,"cyclestatus","lowthreshold")
					statusdataDBmod.write_status_data(AUTO_data,element,"checkcounter",checkcounter+1)
				else:
					# update the status	
					statusdataDBmod.write_status_data(AUTO_data,element,"cyclestatus","done")
					statusdataDBmod.write_status_data(AUTO_data,element,"checkcounter",0)
					statusdataDBmod.write_status_data(AUTO_data,element,"watercounter",0)
					statusdataDBmod.write_status_data(AUTO_data,element,"alertcounter",0)						
							
			
		else: # None case
			print "No Action required, workmode set to None, element: " , element
			logger.info("No Action required, workmode set to None, element: %s " , element)

		cyclestatus=statusdataDBmod.read_status_data(AUTO_data,element,"cyclestatus")
		if cyclestatus=="lowthreshold":
			checkcounter=statusdataDBmod.read_status_data(AUTO_data,element,"checkcounter")
			if checkcounter==1:			
				statusdataDBmod.write_status_data(AUTO_data,element,"cyclestartdate",datetime.now())

		# implment alert message for the cycle exceeding days, and reset the cycle
		if workmode!="None":
			cyclestartdate=statusdataDBmod.read_status_data(AUTO_data,element,"cyclestartdate")
			timedeltadays=sensordbmod.timediffdays(datetime.now(),cyclestartdate)
			if (timedeltadays > maxdays): #the upper limit is set in case of abrupt time change
				textmessage="WARNING "+ sensor + " watering cycle is taking too many days, watering system: " + element + ". Reset watering cycle"
				print textmessage
				# in case of full Auto, activate pump for minimum pulse period
				if workmode=="Full Auto":
					if (timedeltadays < maxdays+2): #the upper limit is set in case of abrupt time change					
						textmessage="WARNING "+ sensor + " watering cycle is taking too many days, watering system: " + element + ". Activate Min pulse + Reset watering cycle"					
						activatewater(element, duration)
				#send alert mail notification
				if mailtype!="warningonly":
					emailmod.sendallmail("alert", textmessage)							
				logger.error(textmessage)
				logger.error("Cycle started %s, Now is %s ", cyclestartdate.strftime("%Y-%m-%d %H:%M:%S"), datetime.now().strftime("%Y-%m-%d %H:%M:%S"))			
				# reset cycle
				statusdataDBmod.write_status_data(AUTO_data,element,"cyclestatus","done")
				statusdataDBmod.write_status_data(AUTO_data,element,"checkcounter",0)
				statusdataDBmod.write_status_data(AUTO_data,element,"watercounter",0)
				statusdataDBmod.write_status_data(AUTO_data,element,"alertcounter",0)	
				statusdataDBmod.write_status_data(AUTO_data,element,"cyclestartdate",datetime.now())

		# implment Critical alert message in case the threshold is below the 0.5 of the minimum
		if workmode!="None":
			belowthr,valid=checkminthreshold(sensor,minthreshold*0.5,minaccepted)
			if valid:
				if belowthr:
					logger.info('sensor %s below half of the actual set threshold', sensor)
					textmessage="CRITICAL: Plant is dying, "+ sensor + " reading below half of the minimum threshold, need to check the " + element
					print textmessage
					#send alert mail notification
					alertcounter=statusdataDBmod.read_status_data(AUTO_data,element,"alertcounter")
					if alertcounter<5:
						emailmod.sendallmail("alert", textmessage)							
						logger.error(textmessage)
						statusdataDBmod.write_status_data(AUTO_data,element,"alertcounter",alertcounter+1)
			else:
				logger.info('sensor %s below valid data', sensor)
				textmessage="WARNING: "+ sensor + " below valid data range, need to check sensor"
				print textmessage
				#send alert mail notification
				alertcounter=statusdataDBmod.read_status_data(AUTO_data,element,"alertcounter")
				if alertcounter<3:
					emailmod.sendallmail("alert", textmessage)							
					logger.error(textmessage)
					statusdataDBmod.write_status_data(AUTO_data,element,"alertcounter",alertcounter+1)		
	return