a4refillpad / Xiaomi

my Xiaomi Device Handlers for Smartthings
Apache License 2.0
248 stars 1.85k forks source link

Support for temperature offset in Xiaomi Outlet #14

Open utocen opened 6 years ago

utocen commented 6 years ago

I propose the following addition to support Xiaomi Outlet temperature offset:

metadata {
<snip>
    preferences {
        section {
            input title: "Temperature Offset", description: "This feature allows you to correct any temperature variations by selecting an offset. Ex: If your sensor consistently reports a temp that's 5 degrees too warm, you'd enter '-5'. If 3 degrees too cold, enter '+3'. Please note, any changes will take effect only on the NEXT temperature change.", displayDuringSetup: false, type: "paragraph", element: "paragraph"
            input "tempOffset", "number", title: "Degrees", description: "Adjust temperature by this many degrees", range: "*..*", displayDuringSetup: false
        }
    }

<snip>
private Map parseReportAttributeMessage(String description) {
    Map descMap = (description - "read attr - ").split(",").inject([:]) { map, param ->
        def nameAndValue = param.split(":")
        map += [(nameAndValue[0].trim()):nameAndValue[1].trim()]
    }

    //log.debug "Desc Map: $descMap"

    Map resultMap = [:]

    if (descMap.cluster == "0001" && descMap.attrId == "0020") {
        resultMap = getBatteryResult(convertHexToInt(descMap.value / 2))
    }
    if (descMap.cluster == "0002" && descMap.attrId == "0000") {

        def value = zigbee.parseHATemperatureValue("temperature: " + (convertHexToInt(descMap.value) / 2), "temperature: ", getTemperatureScale()) as Float
        log.debug "Value is $value, tempOffset is $tempOffset"
        def correctedtemp
        if (getTemperatureScale() == "C") {
            if (tempOffset) {

                correctedtemp= (Math.round(value * 10))/ 10 + tempOffset as Float
            } else {
                correctedtemp= (Math.round(value * 10))/ 10 as Float
            }               
        } else {
            if (tempOffset) {
                correctedtemp= (Math.round(value * 90/5))/10 + 32 + tempOffset as Float
            } else {
                correctedtemp= (Math.round(value * 90/5))/10 + 32 as Float
            }               
        }
        log.debug "Corrected temp is $correctedtemp"

        resultMap = createEvent(name: "temperature", value: correctedtemp, unit: getTemperatureScale())
        log.debug "Temperature Hex convert to ${resultMap.value}%"

    }
    else if (descMap.cluster == "0008" && descMap.attrId == "0000") {
        resultMap = createEvent(name: "switch", value: "off")
    } 
    return resultMap
}
GeorgeCastanza commented 6 years ago

I second this. My outlet reports 6 deg c less than the temp sensor, in the same spot.