Anyone have the Aeotec AerQ?

Saw this, I'm interested how it displays the mold potential? I know there is a driver for it released back in 2.2.2. Anyone have any experience with it?

aerQ_Temp___Humidity_Sensor_01_500x

Hubitat (#100): No mold or dew point reports

Out of stock for EU freq.

1 Like

Because there was no capability for this.. And it was just a calculated value based on the other numbers.

4 Likes

@AverageJoe90

As indicated by Bryan, the sensor only measures temperature and relative humidity. A dew-point is calculated using these two values.

The mold probability is an interpretation of the dew-point. Typically dew-points > 66F are considered to be high-risk for mold growth.

One can calculate dew-point using the average of existing sensors that measure temperature and relative humidity.

Some months ago @JohnRob described/posted an app to calculate dew-point using input from temperature/humidity sensors, but I can't find it right now - so I'm tagging him in the hope that he will see this and post a link below.

I use Node-RED for my automation and I wrote a function to calculate the dew-point. And use its output to trigger automations (eg. turning on dehumidifier) if the dew-point exceeds 62F. If you're interested, my sequence is pasted below:

DP calculator

[{"id":"fa504e1b.17d73","type":"cronplus","z":"74d2e0f3.800ff8","name":"","outputField":"payload","timeZone":"","persistDynamic":false,"commandResponseMsgOutput":"output1","outputs":1,"options":[{"name":"schedule1","topic":"schedule1","payloadType":"default","payload":"","expressionType":"cron","expression":"15 */1 * * * * *","location":"","offset":"0","solarType":"all","solarEvents":"sunrise,sunset"}],"x":1920,"y":1300,"wires":[["e7dfd01c.baa86"]]},{"id":"e7dfd01c.baa86","type":"hubitat device","z":"74d2e0f3.800ff8","name":"Average Temperature","server":"a22e0ea9.276dc8","deviceId":"1794","attribute":"temperature","sendEvent":false,"x":2200,"y":1300,"wires":[["706a1e0a.946868","1ea41050.646bd8"]]},{"id":"706a1e0a.946868","type":"hubitat device","z":"74d2e0f3.800ff8","name":"Average Humidity","server":"a22e0ea9.276dc8","deviceId":"1794","attribute":"humidity","sendEvent":false,"x":2190,"y":1360,"wires":[["a4e7dde4.cca2b"]]},{"id":"1ea41050.646bd8","type":"join","z":"74d2e0f3.800ff8","name":"Merge Temperature & Humidity","mode":"custom","build":"array","property":"payload.value","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"2","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":2490,"y":1329,"wires":[["2f6922d4.083d9e"]]},{"id":"a4e7dde4.cca2b","type":"delay","z":"74d2e0f3.800ff8","name":"25ms","pauseType":"delay","timeout":"25","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":2315,"y":1360,"wires":[["1ea41050.646bd8"]],"l":false},{"id":"2f6922d4.083d9e","type":"function","z":"74d2e0f3.800ff8","name":"Dew-point calculator","func":"function f2c(F) {\nvar C = 5 * ((F-32)/9);\nreturn C;\n}\nfunction dpC(T,RH) {\nvar Td = 243.04 * (Math.log(RH/100)+((17.625*T)/(243.04+T)))/(17.625-Math.log(RH/100)-((17.625*T)/(243.04+T)));\nreturn Td;\n}\nfunction c2f(C) {\nvar F = parseFloat((32 + (9*(C/5))).toFixed(2));\nreturn F;\n}\nvar tempf = msg.payload.value[0];\nvar rel_hum = msg.payload.value[1];\nvar tempc = f2c(tempf);\nvar dewpointc = dpC(tempc,rel_hum);\nmsg.payload = c2f(dewpointc);\nmsg.topic = \"dewpoint\";\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":2760,"y":1329,"wires":[["d5ef1b15.394d98"]]},{"id":"d5ef1b15.394d98","type":"mqtt out","z":"74d2e0f3.800ff8","name":"Indoor Dewpoint","topic":"dewpoint","qos":"2","retain":"true","broker":"40144fb8.a1c1e","x":2990,"y":1329,"wires":[]},{"id":"a22e0ea9.276dc8","type":"hubitat config","name":"HubitatM","usetls":false,"host":"192.168.1.46","port":"80","appId":"1522","nodeRedServer":"http://192.168.1.4:1880","webhookPath":"/hubitat/webhook","autoRefresh":true,"useWebsocket":false},{"id":"40144fb8.a1c1e","type":"mqtt-broker","name":"","broker":"127.0.0.1","port":"1883","tls":"","clientid":"","usetls":false,"compatmode":false,"keepalive":"15","cleansession":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","closeTopic":"","closeRetain":"false","closePayload":"","willTopic":"","willQos":"0","willRetain":"false","willPayload":""}]

3 Likes

My pleasure, I'm honored someone would be using my small App :slight_smile:

It's been a while but I don't think I went back and "fixed" a startup issue where the Dew point is 50 until the first actual reading is made.

To report Dew Point I created a Virtual Dew Point device. No inputs are needed it is only used to display the results.

/*
Dew Point App V003

2020-07-05
    Think we don't need to store the lastTEMP and lastHUMID.  We can just read them when we need to make a calc.
2020-07-20 (open) added Virtual DewPoint Calc device to display the below results.

*/

definition(
    name: "DEW Point Calculator",
    namespace: "hubitat",
    author: "JohnRob",
    description: "DEW Point Calculator",
    category: "Convenience",
    iconUrl: "",
    iconX2Url: "")

preferences {
    page(name: "mainPage")
}

def mainPage() {
    dynamicPage(name: "mainPage", title: " ", install: true, uninstall: true) {
        section {
            //log.debug ("   25   beginning of section")
            input "thisName", "text", title: "Name this DEW Point Calculator", submitOnChange: true
            if(thisName) app.updateLabel("$thisName")
            input "tempSensor", "capability.temperatureMeasurement", title: "Select Temperature Sensor", submitOnChange: true, required: true,     multiple: false
            input "humidSensor", "capability.relativeHumidityMeasurement", title: "Select Humidity Sensor", submitOnChange: true, required:     true, multiple: false
            //log.debug ("  30   end of section")
        } // section
    }   // dymanicPage
}   // mainPage

def installed() {
    initialize()
}

def updated() {
    unsubscribe()
    initialize()
}

def initialize() {
    //log.debug ("  45   begin initialize")

    def dewpointDev = getChildDevice("DEWPoint_${app.id}")
    if(!dewpointDev) dewpointDev = addChildDevice("hubitat", "Virtual DewPoint", "DEWPoint_${app.id}", null, [label: thisName, name: thisName])
    dewpointDev.setDewPoint(0)
    subscribe(tempSensor, "temperature", handlerTEMP)
    subscribe(humidSensor, "humidity", handlerHUMID)

    state.lastHUMID = 50        // these are in the app and will not display in the child
    state.lastTEMP = 50     //  50/50 DEWPoint = 32
}

def calcDEW() {
    def dewpointDev = getChildDevice("DEWPoint_${app.id}")
    //log.debug "  56 state.lastTEMP ${state.lastTEMP}"
    //log.debug "  57 state.lastHUMID ${state.lastHUMID}"
    operandHUMID = state.lastHUMID.toDouble()
    operandTEMP = state.lastTEMP.toDouble()
    
    def dewPoint = (operandTEMP - (9 / 25) * (100 - operandHUMID))
    //log.debug "   62  dewPoint =     ${dewPoint}"
    dewpointDev.setDewPoint(dewPoint.toInteger())
    //return
}

def handlerHUMID(evt) {
    state.lastHUMID = evt.value
    //log.debug " 65 last Humidity = ${evt.value}"
   calcDEW()
}

def handlerTEMP(evt) {
    state.lastTEMP = evt.value
    //log.debug " 71 last Temperature = ${evt.value}"
   calcDEW()
}

//  --- eof ---


//tempSensor.currentTemperature
//humidSensor.currentHumidity
5 Likes

Thank you all for the replies, they are very much appreciated :+1:

1 Like

I recently got two of them and they seem to be working well so far. They paired easily with my C7 hub. The only wonky thing I have noticed so far is the battery reporting, both are brand new but one shows 70 percent and the other 1 percent. Temp and humidity reporting seem to be working as expected.

I knew they were small when I ordered them, but was still amazed when I got them on just how small. Which is a good thing. :grinning:

Can you post a pic please? These are on my wish list.

1 Like

I like Aeotec because in my experience their quality is top notch however it comes with the price to boot. May invest in these but since I already have some in most rooms the urge to upgrade is low.

FYI - I had to modify your app + Driver to get it to work, as your namespaces were clashing (or perhaps I grabbed the wrong versions of these from other posts).

Here's the final code that actually worked for me. Let me know if you have an updated version somewhere and I'll remove these.
Thank you once again for this app, this is fantastic, specially paired with Hubigraphs.

App:

/*
Dew Point App V003

2020-07-05
    Think we don't need to store the lastTEMP and lastHUMID.  We can just read them when we need to make a calc.
2020-07-20 (open) added Virtual DewPoint Calc device to display the below results.

*/

definition(
    name: "DEW Point Calculator",
    namespace: "JohnRob",
    author: "JohnRob",
    description: "DEW Point Calculator",
    category: "Convenience",
    iconUrl: "",
    iconX2Url: "")

preferences {
    page(name: "mainPage")
}

def mainPage() {
    dynamicPage(name: "mainPage", title: " ", install: true, uninstall: true) {
        section {
            //log.debug ("   25   beginning of section")
            input "thisName", "text", title: "Name this DEW Point Calculator", submitOnChange: true
            if(thisName) app.updateLabel("$thisName")
            input "tempSensor", "capability.temperatureMeasurement", title: "Select Temperature Sensor", submitOnChange: true, required: true,     multiple: false
            input "humidSensor", "capability.relativeHumidityMeasurement", title: "Select Humidity Sensor", submitOnChange: true, required:     true, multiple: false
            //log.debug ("  30   end of section")
        } // section
    }   // dymanicPage
}   // mainPage

def installed() {
    initialize()
}

def updated() {
    unsubscribe()
    initialize()
}

def initialize() {
    //log.debug ("  45   begin initialize")

    def dewpointDev = getChildDevice("DEWPoint_${app.id}")
    if(!dewpointDev) dewpointDev = addChildDevice("JohnRob", "Virtual DewPoint", "DEWPoint_${app.id}", null, [label: thisName, name: thisName])
    dewpointDev.setDewPoint(0)
    subscribe(tempSensor, "temperature", handlerTEMP)
    subscribe(humidSensor, "humidity", handlerHUMID)

    state.lastHUMID = 50        // these are in the app and will not display in the child
    state.lastTEMP = 50     //  50/50 DEWPoint = 32
}

def calcDEW() {
    def dewpointDev = getChildDevice("DEWPoint_${app.id}")
    //log.debug "  56 state.lastTEMP ${state.lastTEMP}"
    //log.debug "  57 state.lastHUMID ${state.lastHUMID}"
    operandHUMID = state.lastHUMID.toDouble()
    operandTEMP = state.lastTEMP.toDouble()
    
    def dewPoint = (operandTEMP - (9 / 25) * (100 - operandHUMID))
    //log.debug "   62  dewPoint =     ${dewPoint}"
    dewpointDev.setDewPoint(dewPoint.toInteger())
    //return
}

def handlerHUMID(evt) {
    state.lastHUMID = evt.value
    //log.debug " 65 last Humidity = ${evt.value}"
   calcDEW()
}

def handlerTEMP(evt) {
    state.lastTEMP = evt.value
    //log.debug " 71 last Temperature = ${evt.value}"
   calcDEW()
}

//  --- eof ---

Virtual Device:

// V0.01  Virtual Dew Point Device

metadata {
    definition (name: "Virtual DewPoint", namespace: "JohnRob", author: "several") {
        capability  "Sensor"
        command     "setDewPoint", ["NUMBER"]   // this will be a method.  [] may cause an input box to be created must test.
        attribute   "DewPoint", "Number"      // this will go into the Hub database

    }
    preferences {       // These become entries in the "device" page to ask us for our preferences!
        input name: "txtEnable", type: "bool", title: "Enable descriptionText logging", defaultValue: true
    }
}

def installed() {
    log.warn "installed..."
    setDewPoint(0)
}

def updated() {
    log.info "updated..."
    log.warn "description logging is: ${txtEnable == true}"
}

def parse(String description) {
}       // basically useless.  Included because it is included in the template.

def setDewPoint(dewpoint) {
    // log.debug "   29  dewpoint =   ${dewpoint}"
    def descriptionText = "${device.displayName} was set to $dewpoint"
    if (txtEnable) log.info "${descriptionText}"
    sendEvent(name: "DewPoint", value: dewpoint, unit: "°F", descriptionText: descriptionText)
}

Also, using Hubi-graph I'm now charting the Dew Point next to the Temp and Humidity for the room under my garage I worry about.

image

Very cool!

2 Likes

As requested here is a photo of one installed... For frame of reference that's a quarter next to it.. They are larger than the Aqara Temperature and Humidity Sensors, which are the smallest sensors I own, these are the second smallest.

2 Likes

Running into the same issue with battery monitoring. After running more than a few forced reports, I managed to burn my battery down from 1 to 0, so it would seem it’s less than 100 now.

Also tried smart start but that really didn’t work at all.

I can confirm 2 of my 5 had the battery level bug. Seeing if I can return them. Attempted multiple resets, and exclude/includes.

I have this device, but am having difficulty with it updating when humidity or temperature change. It reports on a 15 minute interval as expected, but shouldn't it report a change earlier if there is one? I have it set to 3% humidity and 1 degree for temp reporting. Is there some other parameter I would need to change?

I'm having the exact same issue. Have you found a solution?

Unfortunately not, still not sure if user error on my part somehow or bug.

I've got 2 coming, so I'll report back

1 Like

Added both of mine and the battery is at 90%. Had to force them to use the right driver so I'm guessing the fringer print is not setup for EU versions.

I think I've managed to get the reporting by % working by disabling periodic reporting

Can you send the finger print?.. I’ll update the driver