0

拥有 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
4

1 回答 1

0

你可以这样做:

def hour = Calendar.instance.HOUR_OF_DAY​

if(hour >= 8 && hour < 17) {
    // It's between 8am and 5pm
}
于 2016-07-16T13:04:44.837 回答