groovy, как установить время начала и окончания

У вас есть SmartThings и новичок в Groovy. Нашел некоторый код для использования с датчиком температуры/движения, но он также должен включать оператор «Выполнять только между временем A и временем B».

До сих пор безуспешно троллил сеть.
Может ли кто-нибудь порекомендовать какие-нибудь операторы, которые я могу добавить к этому коду?

Цените это (много!)

Ларри

~~~~~~~~~~~~~~

/**
 *  Virtual Thermostat
 *
 *  Author: SmartThings
 */
preferences {
    section("Choose a temperature sensor... "){
        input "sensor", "capability.temperatureMeasurement", title: "Sensor"
    }
    section("Select the heater or air conditioner outlet(s)... "){
        input "outlets", "capability.switch", title: "Outlets", multiple: true
    }
    section("Set the desired temperature..."){
        input "setpoint", "decimal", title: "Set Temp"
    }
    section("When there's been movement from (optional, leave blank to not require motion)..."){
        input "motion", "capability.motionSensor", title: "Motion", required: false
    }
    section("Within this number of minutes..."){
        input "minutes", "number", title: "Minutes", required: false
    }
    section("But never go below (or above if A/C) this value with or without motion..."){
        input "emergencySetpoint", "decimal", title: "Emer Temp", required: false
    }
    section("If this is an air conditioner set the mode to 'cool' (defaults to 'heat')..."){
        input "mode", "text", title: "Mode", required: false
    }
}

def installed()
{
    subscribe(sensor, "temperature", temperatureHandler)
    if (motion) {
        subscribe(motion, "motion", motionHandler)
    }
}

def updated()
{
    unsubscribe()
    subscribe(sensor, "temperature", temperatureHandler)
    if (motion) {
        subscribe(motion, "motion", motionHandler)
    }
}

def temperatureHandler(evt)
{
    def isActive = hasBeenRecentMotion()
    if (isActive || emergencySetpoint) {
        evaluate(evt.doubleValue, isActive ? setpoint : emergencySetpoint)
    }
    else {
        outlets.off()
    }
}

def motionHandler(evt)
{
    if (evt.value == "active") {
        def lastTemp = sensor.latestValue("temperature")
        if (lastTemp != null) {
            evaluate(lastTemp, setpoint)
        }
    } else if (evt.value == "inactive") {
        def isActive = hasBeenRecentMotion()
        log.debug "INACTIVE($isActive)"
        if (isActive || emergencySetpoint) {
            def lastTemp = sensor.latestValue("temperature")
            if (lastTemp != null) {
                evaluate(lastTemp, isActive ? setpoint : emergencySetpoint)
            }
        }
        else {
            outlets.off()
        }
    }
}

private evaluate(currentTemp, desiredTemp)
{
    log.debug "EVALUATE($currentTemp, $desiredTemp)"
    def threshold = 1.0
    if (mode == "cool") {
        // air conditioner
        if (currentTemp - desiredTemp >= threshold) {
            outlets.on()
        }
        else if (desiredTemp - currentTemp >= threshold) {
            outlets.off()
        }
    }
    else {
        // heater
        if (desiredTemp - currentTemp >= threshold) {
            outlets.on()
        }
        else if (currentTemp - desiredTemp >= threshold) {
            outlets.off()
        }
    }
}

private hasBeenRecentMotion()
{
    def isActive = false
    if (motion && minutes) {
        def deltaMinutes = minutes as Long
        if (deltaMinutes) {
            def motionEvents = motion.eventsSince(new Date(now() - (60000 * deltaMinutes)))
            log.trace "Found ${motionEvents?.size() ?: 0} events in the last $deltaMinutes minutes"
            if (motionEvents.find { it.value == "active" }) {
                isActive = true
            }
        }
    }
    else {
        isActive = true
    }
    isActive

person user3074617    schedule 16.07.2016    source источник


Ответы (1)


Вы можете сделать:

def hour = Calendar.instance.HOUR_OF_DAY​

if(hour >= 8 && hour < 17) {
    // It's between 8am and 5pm
}
person tim_yates    schedule 16.07.2016
comment
часовой пояс будет UTC, и вы можете внести изменения, чтобы настроить числа. - person Dylan Bijnagte; 16.07.2016