and all of this works well for you? I know my experience with HE is about 99% solid I have never used this type of device so am unfamiliar with how well it works.
I haven't set it up yet, too many projects in and out of Hubitat, and since this means "full family impact" (I'm playing w/their HVAC comfort) I want to be sure the switch over will go well. I had starting playing with it a while back but there were some initial issues that have been addressed since the first 2.2.4 release so I'm going to start working w/it again.
I have a new thermostat (two, actually, a Honeywell T6 and a Zen) and am going to reconfigure them to use the HE system, and observe how they function w/it. After that test I'll switch over to one of them. Assuming they both play well I'll let my wife decide which one she likes best. (She's the boss, after all.)
I believe that @AdamV is actively using it, he may have some comments on working w/it in "real life."
FWIW - Apple HomeKit can talk directly over the LAN to Ecobee thermostats that support HomeKit. There is no external cloud connection for Apple HomeKit to do this. And if you have an always on device that can act as a HomeKit controller, like an AppleTV or iPad, then you can create some simple HomeKit Automations that will run locally across your LAN.
During a Hurricane related internet outage a few months back, I recall testing to see if my iPhone could still control my pair of Ecobee 3 Lite thermostats. It worked shockingly well.
I found some cheap Tuya Zigbee humidity and temperature sensors on ebay that work well. For some reason the built-in generic zigbee drivers don't work (they detect the device but reporting doesn't work), but I was able to hack the Hubitat sample Zigbee drivers in github with a one or two line modification and have the little device reporting correctly. I'd be happy to share if interested.
If interested, here's the same one I got. I got it because of the LCD. Note: temperature is always in Celsius, but Hubitat can magically show Fahrenheit within dashboards/in the UI.
Those are darn cute...too bad they can't report in F on their screen, I'd probably get a couple of them.
I've learned how to do C to F conversion on the fly in my head (ok, it takes me 5 seconds to do the math). They apparently also have a newer version with no display at all, but I haven't tried them.
Situation is: i have a heater and temperature sensor.
How do (can I ?) combine them to "thermostat" and control by Thermostat Controller ?
Install Thermostat Controller. Pick the real connected thermostat, then pick your connected temperature sensor as the remote sensor.
A virtual Thermostat with the same name as your real Thermostat will be created with “Controller” appended to its name. You change the switch in the app from Free to Controlled. Now your real connected thermostat will use the set points of the virtual thermostat.
Have NO real thermostat. But heaters controlled by relay and temperature sensors.
- Create a Virtual Thermostat on HE
- Setup a very simple Rule Machine rule that uses the condition of the virtual controller device's custom attribute thermostatOperatingState , then you can have it turn your heater ON when the Virtual Thermostat Controller value = "heating" and turn if OFF when the value = "idle".
- Name it in the device label.
- Add the Hubitat Virtual Thermostat to a new Thermostat Controller child app.
- Select your temperature sensor(s) as the remote temperature sensor(s).
- It will create a device named with your Virtual Thermostat's name, and the word "Controller" appended to it.
- Change the switch in the app from Free to Controlled. Now your virtual thermostat will use the set points of the thermostat controller and the remote sensors as input for the thermostat hysteresis.
Looks promising. Will check as soon as posisble and provide a feedback. Thank You very much.
I'm interested in your hack driver version because this thing (tuya sensor) reports only when it feels like it which has nothing to do with temperature nor humidity change.
Curiously, on a whim I reverted the driver for this to the generic zigbee one and it’s working perfectly fine. I’ll do some flip flopping and see if there’s actually a difference and will post my hack.
So with the standard Zigbee "generic motion/humidity sensor", I get the following readings, which appear to be roughly every 5 minutes. I'll switch the driver and report back for the other one (the publicly posted sample driver that I modified):
temperature | 69.62 | °F | Humidity Sensor: Rog Bathroom temperature is 69.62°F | DEVICE | 2021-03-20 11:38:06.511 AM PDT | |
---|---|---|---|---|---|---|
humidity | 66.8 | %RH | Humidity Sensor: Rog Bathroom is 66.8%RH | DEVICE | 2021-03-20 11:22:59.998 AM PDT | |
humidity | 73.2 | %RH | Humidity Sensor: Rog Bathroom is 73.2%RH | DEVICE | 2021-03-20 11:18:58.140 AM PDT | |
temperature | 69.80 | °F | Humidity Sensor: Rog Bathroom temperature is 69.80°F | DEVICE | 2021-03-20 11:18:57.600 AM PDT | |
humidity | 61.5 | %RH | Humidity Sensor: Rog Bathroom is 61.5%RH | DEVICE | 2021-03-20 11:17:57.666 AM PDT | |
humidity | 51.6 | %RH | Humidity Sensor: Rog Bathroom is 51.6%RH | DEVICE | 2021-03-20 11:15:56.684 AM PDT | |
temperature | 69.44 | °F | Humidity Sensor: Rog Bathroom temperature is 69.44°F | DEVICE | 2021-03-20 11:15:56.173 AM PDT | |
humidity | 46.5 | %RH | Humidity Sensor: Rog Bathroom is 46.5%RH | DEVICE | 2021-03-20 10:13:27.636 AM PDT | |
temperature | 69.99 | °F | Humidity Sensor: Rog Bathroom temperature is 69.99°F | DEVICE | 2021-03-20 10:13:27.127 AM PDT | |
humidity | 42.4 | %RH | Humidity Sensor: Rog Bathroom is 42.4%RH | DEVICE | 2021-03-20 09:33:08.923 AM PDT | |
temperature | 70.34 | °F | Humidity Sensor: Rog Bathroom temperature is 70.34°F | DEVICE | 2021-03-20 09:33:08.423 AM PDT | |
humidity | 43 | %RH | Humidity Sensor: Rog Bathroom is 43%RH | DEVICE | 2021-03-20 09:25:05.158 AM PDT | |
temperature | 69.09 | °F | Humidity Sensor: Rog Bathroom temperature is 69.09°F | DEVICE | 2021-03-20 09:25:04.646 AM PDT | |
temperature | 70.34 | °F | Humidity Sensor: Rog Bathroom temperature is 70.34°F | DEVICE | 2021-03-20 08:01:25.964 AM PDT | |
humidity | 43.5 | %RH | Humidity Sensor: Rog Bathroom is 43.5%RH | DEVICE | 2021-03-20 07:53:22.656 AM PDT | |
temperature | 69.09 | °F | Humidity Sensor: Rog Bathroom temperature is 69.09°F | DEVICE | 2021-03-20 07:53:22.150 AM PDT | |
humidity | 44.9 | %RH | Humidity Sensor: Rog Bathroom is 44.9%RH | DEVICE | 2021-03-20 07:46:19.358 AM PDT | |
temperature | 67.82 | °F | Humidity Sensor: Rog Bathroom temperature is 67.82°F | DEVICE | 2021-03-20 07:46:18.858 AM PDT | |
humidity | 46.3 | %RH | Humidity Sensor: Rog Bathroom is 46.3%RH | DEVICE | 2021-03-20 07:39:16.032 AM PDT | |
temperature | 66.57 | °F | Humidity Sensor: Rog Bathroom temperature is 66.57°F | DEVICE | 2021-03-20 07:39:15.492 AM PDT | |
humidity | 47.3 | %RH | Humidity Sensor: Rog Bathroom is 47.3%RH | DEVICE | 2021-03-20 07:00:57.999 AM PDT | |
temperature | 65.30 | °F | Humidity Sensor: Rog Bathroom temperature is 65.30°F | DEVICE | 2021-03-20 07:00:57.501 AM PDT | |
humidity | 45.2 | %RH | Humidity Sensor: Rog Bathroom is 45.2%RH | DEVICE | 2021-03-20 06:08:33.391 AM PDT | |
temperature | 66.57 | °F | Humidity Sensor: Rog Bathroom temperature is 66.57°F | DEVICE | 2021-03-20 06:08:32.919 AM PDT |
Here's the modified driver. It's been a while, but think the change had to do specifically with the humidity line.
/*
Tuya Humidty and Temperature Sensor
*/
import groovy.transform.Field
@Field Map diagAttributes = [
"0000":["name":"ResetCount","val":0x0000],
"0104":["name":"TXRetrys","val":0x0104],
"0105":["name":"TXFails","val":0x0105],
"011A":["name":"PacketDrops","val":0x011A],
"0115":["name":"DecryptFailures","val":0x0115],
"011D":["name":"RSSI","val":0x011D],
"011E":["name":"Parent","val":0x011E],
"011F":["name":"Children","val":0x011F],
"0120":["name":"Neighbors","val":0x0120]
]
metadata {
definition (name: "Tuya TS0201 Humidity and Temperature", namespace: "rnoia", author: "rnoia") {
capability "Configuration"
capability "Refresh"
capability "Temperature Measurement"
capability "RelativeHumidityMeasurement"
capability "Sensor"
fingerprint profileId: "0000", inClusters: " 0000,0001,0402,0405", manufacturer: "TuYa", model: "TS0201", deviceJoinName: "Hummidity and Temperature Sensor"
/*
driver based on: https://github.com/hubitat/HubitatPublic/blob/master/examples/drivers/environmentSensor.groovy
by iharyadi/maxwell
Data from Hub upon inclusion:
Manufactutrer: _TZ2000_a476raq2
endpointId: 01
application: 43
softwareBuild:
inClusters: 0000,0001,0402,0405
outClusters: 0019
model: TS0201
manufacturer: _TZ2000_a476raq2
[raw:catchall: 0000 0013 00 00 0040 00 5930 00 00 0000 00 00 81305972DCE4FEFFBD1BEC80, profileId:0000, clusterId:0013, clusterInt:19, sourceEndpoint:00, destinationEndpoint:00, options:0040, messageType:00, dni:5930, isClusterSpecific:false, isManufacturerSpecific:false, manufacturerId:0000, command:00, direction:00, data:[81, 30, 59, 72, DC, E4, FE, FF, BD, 1B, EC, 80]]
*/
}
preferences {
//standard logging options
input name: "logEnable", type: "bool", title: "Enable debug logging", defaultValue: true
input name: "txtEnable", type: "bool", title: "Enable descriptionText logging", defaultValue: true
input "refTemp", "decimal", title: "Reference temperature", description: "Enter current reference temperature reading", range: "*..*"
input "tempOffset", "decimal", title: "Degrees", description: "Adjust temperature by this many degrees in Celcius",range: "*..*"
input "tempFilter", "decimal", title: "Coeficient", description: "Temperature filter between 0.0 and 1.0",range: "*..*"
input "humOffset", "decimal", title: "Percent", description: "Adjust humidity by this many percent",range: "*..*"
}
}
def logsOff(){
log.warn "debug logging disabled..."
device.updateSetting("logEnable",[value:"false",type:"bool"])
}
def parse(String description) {
if (logEnable) log.debug "description is ${description}"
if (description.startsWith("catchall")) return
def descMap = zigbee.parseDescriptionAsMap(description)
if (logEnable) log.debug "descMap:${descMap}"
def cluster = descMap.cluster
def hexValue = descMap.value
def attrId = descMap.attrId
switch (cluster){
case "0402" : //temp
getTemperatureResult(hexValue)
break
case "0405" : //humidity
getHumidityResult(hexValue)
break
case "0B05" : //diag
if (logEnable) log.warn "attrId:${attrId}, hexValue:${hexValue}"
def value = hexStrToUnsignedInt(hexValue)
log.warn "diag- ${diagAttributes."${attrId}".name}:${value} "
break
default :
//log.warn "skipped cluster: ${cluster}, descMap:${descMap}"
break
}
return
}
//event methods
private getTemperatureResult(hex){
def valueRaw = hexStrToSignedInt(hex)
valueRaw = valueRaw / 100
def value = convertTemperatureIfNeeded(valueRaw.toFloat(),"c",1)
state.sensorTemp = value
if (state.tempOffset) {
value = (value.toFloat() + state.tempOffset.toFloat()).round(2)
}
def name = "temperature"
def unit = "°${location.temperatureScale}"
def descriptionText = "${device.displayName} ${name} is ${value}${unit}"
if (txtEnable) log.info "${descriptionText}"
sendEvent(name: name,value: value,descriptionText: descriptionText,unit: unit)
}
private getHumidityResult(hex){
def valueRaw = hexStrToUnsignedInt(hex)
def value = valueRaw / 100
def name = "humidity"
def unit = "%"
def descriptionText = "${device.displayName} ${name} is ${value}${unit}"
if (txtEnable) log.info "${descriptionText}"
sendEvent(name: name,value: value,descriptionText: descriptionText,unit: unit)
}
//capability and device methods
def off() {
zigbee.off()
}
def on() {
zigbee.on()
}
def refresh() {
log.debug "Refresh"
//readAttribute(cluster,attribute,mfg code,optional delay ms)
def cmds = zigbee.readAttribute(0x0402,0x0000,[:],200) + //temp
zigbee.readAttribute(0x0405,0x0000,[:],200) + //humidity
diagAttributes.each{ it ->
//log.debug "it:${it.value.val}"
// cmds += zigbee.readAttribute(0x0B05,it.value.val,[:],200)
}
return cmds
}
def configure() {
log.debug "Configuring Reporting and Bindings."
runIn(1800,logsOff)
//temp offset init
state.tempOffset = 0
List cmds = zigbee.temperatureConfig(5,300) //temp
cmds = cmds + zigbee.configureReporting(0x0405, 0x0000, DataType.UINT16, 5, 300, 100) //humidity
cmds = cmds + zigbee.configureReporting(0x0403, 0x0000, DataType.UINT16, 5, 300, 2) //pressure
cmds = cmds + refresh()
log.info "cmds:${cmds}"
return cmds
}
def updated() {
log.trace "Updated()"
log.warn "debug logging is: ${logEnable == true}"
log.warn "description logging is: ${txtEnable == true}"
if (logEnable) runIn(1800,logsOff)
def crntTemp = device?.currentValue("temperature")
if (refTemp && crntTemp && state.sensorTemp) {
def prevOffset = (state.tempOffset ?: 0).toFloat().round(2)
def deviceTemp = state.sensorTemp.toFloat().round(2)
def newOffset = (refTemp.toFloat() - deviceTemp).round(2)
def newTemp = (deviceTemp + newOffset).round(2)
//send new event on offSet change
if (newOffset.toString() != prevOffset.toString()){
state.tempOffset = newOffset
def map = [name: "temperature", value: "${newTemp}", descriptionText: "${device.displayName} temperature offset was set to ${newOffset}°${location.temperatureScale}"]
if (txtEnable) log.info "${map.descriptionText}"
sendEvent(map)
}
//clear refTemp so it doesn't get changed later...
device.removeSetting("refTemp")
}
}
I just checked my logs again and for the entire duration of the day today whenever the temperature or humidity is constant (unchanged since last time) there does not appear to be an event. You can force it with the little button the device, however.
Thank you for help. I tried your version but unfortunately it does not change the erratic behavior of this device. It is true that pressing the button will update the readings but this is antithetical to an automation system point of view.
I wish there would be a setting to have the device update itself on a timely manner. The way it behaving now makes it totaly useless.
Thanks again for your effort. It is appreciated.
This,
I use temp probes (connected with nodemcu's/konnected), wired thermal actuators on the rads (again, nodemcu's/konnected/3V_relays), one zwave boiler switch and schedules through webcore. Works ace.
I've gone through my AC-powered environmental devices and they all behave the same, despite having power to report constantly/periodically:
-
Aeotec motion (mulisensor 6) sensor (which also does humidity) doesn't do constant humidity or any environmental sensing periodically - only upon change. Going through my logs, the AC reporting is 5-10 times a second (showing 100%). Lux, temperature and humidity only show up on a change.
-
My homeseer light sensor (which also does temperature), has a selectable polling temperature interval when ac-powered (not on battery). but the reporting behavior is the same - temperature only on change. I will admit this does seem a bit odd to me as well, especially since the polling is selectable.
However, I do think the Tuya device isn't as sensitive as it could be, I can see periods of no change, like when I take a shower, that it goes from 46% to 75%. But this device's battery has lasted over 9 months, so I'm willing to accept that.
This topic was automatically closed 365 days after the last reply. New replies are no longer allowed.