[Release] Tuya Zigbee Temperature-Humidity Sensor Driver

I've created a driver for the Tuya Zigbee CK-TLSR8656 Temperature-Humidity Sensor from Manufacturer eWeLink for the Hubitat Elevation C8-Pro. Code is available here:
[Tuya Zigbee CK-TLSR8656 Temperature-Humidity Sensor Driver]

1 Like

I have now made this a more generalised driver with support for multiple fingerprints of models and manufacturers. it is available here:
[Release]Tuya Zigbee Temperature-Humidity Sensor driver

1 Like

Thanks for this. Been trying to find a driver to make these sensors work all afternoon. Working on my CK-TLSR8656-SS5-01(7014).
I did find though that they would not always pair correctly to my C7. I had to stand close to the hub and reset them multiple times. You know the pair worked correctly if the light stops blinking once it asks you to name the sensor. If it keeps blinking, delete and re-pair.

Is it possible to make these update on temp change, like the generic zigbee driver?
I'm needing the "on 0.25C change" update as I'm using them for a climate control system. The room would be far too hot after 15 minutes.

Yes I had trouble paring them as well and had more luck with the Model "TS0201" from Manufacturer "_TZ3000_fllyghyj".

I'm not sure when the unit will update on temperature change as that is up to the programing in the unit however there is a forced synthetic update because of this uncertainty which I have set up. I have asked the shop in AliExpress where I got mine from if there is documentation of the manufacturer specific interface considerations but have had no luck getting this out of them. I believe If I am able to find this documentation, I may be able to change the threshold delta temperature at which an update is sent as it definitely has clusters which may possibly be usable to do this but I am loath to experiment with this without the documentation as I may brick my sensor. If any one has access to this documentation I would find it very useful.

From Copilot:

:mag: Can You Adjust the Delta Temperature Threshold?

Short answer: Not directly from the Hubitat driver—unless the sensor itself exposes a configurable reporting threshold via Zigbee cluster commands.


:brain: Here's Why:

The CK-TLSR8656 sensor likely uses the Zigbee Temperature Measurement Cluster (0x0402) to report changes. Many Zigbee sensors support a “reporting threshold” (i.e. minimum delta before sending an update), but:

  • Tuya devices often use proprietary firmware and don’t expose standard configuration attributes.
  • Hubitat’s driver layer can’t force the sensor to report more frequently unless the sensor supports it.

:hammer_and_wrench: What You Can Try:

1. Check for Tuya-Specific Reporting Configuration

Some Tuya sensors respond to custom cluster commands via Cluster FC11 or manufacturer-specific attributes. You could try sending a writeAttribute to adjust the reporting interval or delta threshold—if supported.

I can help craft a test block like:

zigbee.writeAttribute(0x0402, 0x0002, DataType.UINT16, 25) // Example: set reportable change to 0.25°C

…but only if the device accepts it.

2. Polling via Wake Trigger

As the sensor can be woken manually (via reset pin), you could experiment with a timed polling strategy—but it’s not ideal for battery-powered devices.


I would rather not wake the sensor via software polling due to battery life issues and this would not achieve you requirement anyway,'

Sincerely
Ivan Piacun MIITP CITPNZ

Well I used Claude AI to rewrite your code (Claude is specifically built for writing code and I've found it to be far better then copilot) and it appears to be working somewhat.
It looks like both sensors are having issues pushing updates. (Someone mentioned on the Aliexpress page that they were getting erratic/inconsistent updates).
I have 2 of these sensors sitting side by side, 1 using your driver and the other using the Claude driver.
Unfortunately, your driver doesn't appear to be receiving a temperature as it hasn't changed in 17 hours (the sensor beside it is also showing a temp difference of 8C).
Though the battery has had multiple updates.

When paired to my smartthings hub, the updates look to be threshold based as when I hold the sensor in my hand, the temp increases within a minute.

This is the log from the sensor using the Claude AI driver. It seems to be updating a lot more often.

This is the Claude AI driver code if you want to have a look.

/**
 *  Tuya Zigbee Temperature/Humidity Sensor driver for Hubitat Elevation C8-PRO
 *
 *  Version 1.1.0
 *
 *	Copyright 2025 Ivan Piacun, BAP Enterprises Ltd (NZ)
 *
 *  https://community.hubitat.com/t/release-Tuya-Zigbee-CK-TLSR8656-Temp-Humidity-Sensor/86465
 *
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 *  in compliance with the License. You may obtain a copy of the License at:
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
 *  on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
 *  for the specific language governing permissions and limitations under the License.
 *
 *  Preferences Settings:
 *   Enable Debug Logging (debugLogging)
 *   When toggled ON, it activates general driver logs:
 *    Parsing messages
 *    Battery and voltage reports
 *    Scheduling info (auto-refresh, timeouts)
 *    Configuration steps (e.g. when configure() runs)
 *    These are usually log.debug or log.warn entries
 *   This helps you verify that the driver is functioning and responding as expected
 *
 *   Enable Trace Logging (traceLogging)
 *   When toggled ON, it enables detailed sensor value tracing:
 *    Cluster-specific readouts (e.g. 📡 Trace Temp: Raw=1482, Final=14.82)
 *    Calibration offsets applied
 *    tempStatus / humidityStatus outcomes
 *    Works in tandem with Cluster to trace selector:
 *    Choose between "Temperature (0402)" or "Humidity (0405)"
 *
 *   Temperature Change Threshold (tempChangeThreshold)
 *   Sets the minimum temperature change (in °C) required to trigger an update
 *   Default is 0.25°C
 *
 *   Notes:
 *    1) CK-TLSR8656 sensor sleeps between updates and a refresh will not wake it. To wake it and get a refresh 
 *       of Temperature, Humidity, and Battery you need to briefly depress its reset button with a pin.
 *    2) On an update from the sensor the current Temperature Offset is applied to the Raw Temperature and
 *       the Humidity Offset is applied to the Raw humidity and these are displayed as Temperature
 *       and Humidity values.
 *    3) Temperature updates only occur when the change exceeds the configured threshold (default 0.25°C)
 *
 *  Version 1.0.0  2025-07-18  Initial Version
 *  Version 1.0.1  2025-07-18  Synthetic Offset Application on Refresh even if no data arrives. 
 *  Version 1.0.2  2025-07-18  First published version. 
 *  Version 1.0.4  2025-07-19  Added support for fahrenheit configuration. 
 *  Version 1.0.5  2025-07-21  Added Import URL. 
 *  Version 1.0.6  2025-07-31  Rename device driver to a more generalised name from 'Tuya Zigbee CK-TLSR8656 Temp/Humidity SensoR". 
 *                             Added "TS0201"  "_TZ3000_fllyghyj".
 *                             Added Fingerprint matching and Diagnostic
 *  Version 1.0.7  2025-08-02  Surfaced version in attributes 
 *  Version 1.0.8  2025-08-23  Fixed Trace Logging of Temperature
 *  Version 1.1.0  2025-08-23  Changed from 15-minute updates to threshold-based updates (0.25°C default) (Claude AI)
*/
import java.text.SimpleDateFormat

static String version() { '1.1.0' }
static String timeStamp() { '2025/08/23 10:30 AM' }

metadata { 
    definition(name: "Tuya Zigbee Temperature/Humidity Sensor Threshold Based", namespace: "ivanpiacun.driver", author: "Ivan Piacun & Copilot", importUrl: 'https://raw.githubusercontent.com/IvanPiacun/Hubitat/refs/heads/main/Tuya%20Zigbee%20Temperature-Humidity%20Sensor.groovy') {
    capability "TemperatureMeasurement" 
    capability "RelativeHumidityMeasurement" 
    capability "Battery" 
    capability "VoltageMeasurement"

attribute "tempStatus", "string"
attribute "humidityStatus", "string"
attribute "debugState", "string"
attribute "traceState", "string"
attribute "tempOffsetState", "string"
attribute "humidityOffsetState", "string"
attribute "tempUnitState", "string"
attribute "lastTempChange", "string"
attribute "tempChangeThresholdState", "string"
       
        
command "configure"
command "refresh"
command "forceUpdate"

fingerprint profileId:"0104", endpointId:"01", inClusters:"0000,0001,0003,0004,0020,0402,0405,FC11", outClusters:"0019,000A", model:"CK-TLSR8656-SS5-01(7014)", manufacturer:"eWeLink", deviceJoinName: "Tuya Temperature/Humidity Sensor"
fingerprint profileId:"0104", endpointId:"01", inClusters:"0001,0003,0402,0405,0000", outClusters:"0003,0019,000A",  model: "TS0201", manufacturer: "_TZ3000_fllyghyj", deviceJoinName: "Tuya Temperature/Humidity Sensor"

}

preferences { 
    input name: "debugLogging", type: "bool", title: "Enable debug logging?", defaultValue: true
    input name: "traceLogging", type: "bool", title: "Enable trace logging?", defaultValue: false
    input name: "traceCluster", type: "enum", title: "Cluster to trace", options: ["None", "Temperature (0402)", "Humidity (0405)"], defaultValue: "None" 
    input name: "tempUnit", type: "enum", title: "Temperature Unit", options: ["Celsius", "Fahrenheit"], defaultValue: "Celsius", description: "Choose Celsius or Fahrenheit display"
    input name: "tempOffset", type: "decimal", title: "Temperature offset (°C)", defaultValue: 0.0 
    input name: "humidityOffset", type: "decimal", title: "Humidity offset (%)", defaultValue: 0.0
    input name: "tempChangeThreshold", type: "decimal", title: "Temperature change threshold (°C)", defaultValue: 0.25, description: "Minimum temperature change to trigger an update"
    input name: "humidityChangeThreshold", type: "decimal", title: "Humidity change threshold (%)", defaultValue: 1.0, description: "Minimum humidity change to trigger an update"
}
}

def getTuyaTempHumidityFingerprints() {
    return [
        [
            profileId: "0104",
            endpointId: "01",
            inClusters: "0001,0003,0402,0405,0000",
            outClusters: "0003,0019,000A",
            manufacturer: "_TZ3000_fllyghyj",
            model: "TS0201",
            deviceJoinName: "Tuya Temperature/Humidity Sensor"
        ],
        [
            profileId: "0104",
            endpointId: "01",
            inClusters: "0000,0001,0003,0004,0020,0402,0405,FC11",
            outClusters: "0019,000A",
            manufacturer: "eWeLink",
            model: "CK-TLSR8656-SS5-01(7014)",
            deviceJoinName: "Tuya Temperature/Humidity Sensor"
        ]
    ]
}

def diagnoseFingerprintMatch() {
    def model = device.getDataValue("model") ?: "UNKNOWN"
    def manufacturer = device.getDataValue("manufacturer") ?: "UNKNOWN"
    def clustersIn = device.getDataValue("inClusters") ?: "UNKNOWN"
    def endpointId = device.getDataValue("endpointId") ?: "UNKNOWN"

    def match = getTuyaTempHumidityFingerprints().find { fp ->
        fp.model == model &&
        fp.manufacturer == manufacturer &&
        fp.inClusters == clustersIn &&
        fp.endpointId == endpointId
    }

    if (match) {
        log.trace "✅ Device matches known fingerprint: ${match.deviceJoinName} (${match.model})"
        state.debugState = "Matched: ${match.model}"
    } else {
        log.warn "❌ No matching fingerprint found for device → Model: ${model}, Manufacturer: ${manufacturer}, Endpoint: ${endpointId}, InClusters: ${clustersIn}"
        state.debugState = "No match"
    }
}

private void processTemperature(Integer rawTemp, Boolean forceUpdate = false) {
    def offset = (settings?.tempOffset ?: 0)
    def tempC = ((rawTemp / 100.0) + offset) as BigDecimal
    def threshold = (settings?.tempChangeThreshold ?: 0.25) as BigDecimal
    
    // Get the last temperature in Celsius for comparison
    def lastTempC = state.lastTempCelsius as BigDecimal ?: null
    
    // Calculate temperature change
    def tempChange = lastTempC ? Math.abs(tempC - lastTempC) : threshold + 1
    
    // Check if update should be sent
    def shouldUpdate = forceUpdate || (lastTempC == null) || (tempChange >= threshold)
    
    if (shouldUpdate) {
        def converted = tempC
        def unit = "°C"
        if (settings?.tempUnit == "Fahrenheit") {
            converted = (tempC * 1.8 + 32).toBigDecimal().setScale(1, BigDecimal.ROUND_HALF_UP)
            unit = "°F"
        }
        
        state.tempStatus = ((tempC < 18.0) ? "Cold" : (tempC > 24.0) ? "Hot" : "Comfortable")
        state.lastTempCelsius = tempC
        
        sendEvent(name: "temperature", value: converted, unit: unit)
        sendEvent(name: "tempUnitState", value: settings?.tempUnit ?: "Celsius")
        sendEvent(name: "tempStatus", value: state.tempStatus)
        sendEvent(name: "lastTempChange", value: getFormattedDateTime())
        
        if (settings?.traceLogging) {
            log.trace "📏 processTemperature() → RawTemp=${rawTemp} | Offset=${offset} | Final=${converted}${unit} | Change=${tempChange}°C"
        }
        if (debugLogging) {
            log.debug "Temperature updated: ${converted}${unit} (change: ${tempChange}°C)"
        }
    } else {
        if (settings?.traceLogging) {
            log.trace "📏 Temperature change (${tempChange}°C) below threshold (${threshold}°C), skipping update"
        }
    }
}

private void processHumidity(Integer rawHumidity, Boolean forceUpdate = false) {
    def offsetHumidity = (settings?.humidityOffset ?: 0.0) as BigDecimal
    def finalHumidity = (offsetHumidity + (rawHumidity / 100.0)) as BigDecimal
    def threshold = (settings?.humidityChangeThreshold ?: 1.0) as BigDecimal
    
    // Get the last humidity for comparison
    def lastHumidity = state.lastHumidity as BigDecimal ?: null
    
    // Calculate humidity change
    def humidityChange = lastHumidity ? Math.abs(finalHumidity - lastHumidity) : threshold + 1
    
    // Check if update should be sent
    def shouldUpdate = forceUpdate || (lastHumidity == null) || (humidityChange >= threshold)
    
    if (shouldUpdate) {
        state.lastHumidity = finalHumidity
        sendEvent(name: "humidity", value: finalHumidity, unit: "%")
        state.humidityStatus = (finalHumidity < 40) ? "Dry" : (finalHumidity > 65) ? "Humid" : "Comfortable"
        sendEvent(name: "humidityStatus", value: state?.humidityStatus)
        
        if (traceLogging && traceCluster == "Humidity (0405)") {
            log.trace "📡 Trace Humidity: Raw=${rawHumidity}, Offset=${offsetHumidity}, Final=${finalHumidity}, Change=${humidityChange}%"
        }
        if (debugLogging) {
            log.debug "Humidity updated: ${finalHumidity}% (change: ${humidityChange}%)"
        }
    } else {
        if (settings?.traceLogging) {
            log.trace "💧 Humidity change (${humidityChange}%) below threshold (${threshold}%), skipping update"
        }
    }
}

private void applySyntheticTempIfNoData(Integer lastKnownRaw) {
    if (lastKnownRaw == null) return
    processTemperature(lastKnownRaw, true)  // Force update on refresh
}

def initialize() {
    log.debug "⚙️ initialize() called"
    diagnoseFingerprintMatch()
    configure()
}

def uninstalled() {
    unschedule()
    state.clear()
    log.debug "🚪 uninstalled() → Driver resources released"
}

def getFormattedDateTime() {
    def formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
    return formatter.format(new Date())
}

def driverVersionAndTimeStamp() { version() + ' ' + timeStamp() }

def parse(String description) { 
    if (debugLogging) log.debug "Parsing: $description" 
    def descMap = zigbee.parseDescriptionAsMap(description)

    state.lastSensorReport = getFormattedDateTime()

    switch(descMap.clusterInt) {
        case 0x0402:
            if (traceLogging && traceCluster == "Temperature (0402)") {
               log.trace "🌡 Handling Temperature Measurement cluster (0402)"
            }
            def rawTemp = Integer.parseInt(descMap.value, 16)
            state.lastTempRaw = rawTemp
            processTemperature(rawTemp)
            break
            
        case 0x0405:
            if (traceLogging && traceCluster == "Humidity (0405)") {
               log.trace "💧 Handling Humidity Measurement cluster (0405)"
            }
            def rawHumidity = Integer.parseInt(descMap.value, 16)
            processHumidity(rawHumidity)
            break

        case 0x0001:
            if (descMap.attrInt == 0x0021) {
                def rawBattery = Integer.parseInt(descMap.value, 16)
                def battery = (rawBattery / 2).toInteger()
                sendEvent(name: "battery", value: battery, unit: "%")
                if (debugLogging) log.debug "Battery raw=${rawBattery}, final=${battery}%"
            } else if (descMap.attrInt == 0x0020) {
                def voltage = Integer.parseInt(descMap.value, 16) / 10.0
                sendEvent(name: "voltage", value: voltage, unit: "V")
                if (debugLogging) log.debug "Voltage=${voltage}V"
            }
            break

        default:
            if (debugLogging) log.debug "Unhandled cluster: ${descMap.clusterInt}"
            break
    }
}

def refresh() {  
    applySyntheticTempIfNoData(state?.lastTempRaw)
    if (debugLogging) log.debug "🔄 Refresh requested..."
    state.lastSensorReport = getFormattedDateTime() 
    return [ 
        zigbee.readAttribute(0x0402, 0x0000), 
        zigbee.readAttribute(0x0405, 0x0000), 
        zigbee.readAttribute(0x0001, 0x0020), 
        zigbee.readAttribute(0x0001, 0x0021) 
    ] 
}

def forceUpdate() {
    log.info "⚡ Force update requested - bypassing thresholds"
    if (state?.lastTempRaw != null) {
        processTemperature(state.lastTempRaw, true)
    }
    // Note: We don't have stored raw humidity, so we can't force update it
    // unless we trigger a refresh from the device
}

def configure() {
    unschedule()
    // Remove the 15-minute scheduled refresh since we're now threshold-based
    // You can uncomment the next line if you want periodic battery checks
    // runEvery1Hour("checkBattery")
    
    state.driverVersion = driverVersionAndTimeStamp()
 
    def tempUnit = settings?.tempUnit ?: "Celsius"
    def tempOffsetLabel = "${settings?.tempOffset ?: 0.0}°C"
    def humidityOffsetLabel = "${settings?.humidityOffset ?: 0.0}%"
    def tempThresholdLabel = "${settings?.tempChangeThreshold ?: 0.25}°C"
    
    if (state?.lastTempRaw != null) {
        processTemperature(state.lastTempRaw, true)  // Force update on config change
        log.info "🔁 Re-sent temp reading after configuration update"
    }
    
    sendEvent(name: "tempUnitState", value: tempUnit)
    sendEvent(name: "tempOffsetState", value: tempOffsetLabel)
    sendEvent(name: "humidityOffsetState", value: humidityOffsetLabel)
    sendEvent(name: "tempChangeThresholdState", value: tempThresholdLabel)
    sendEvent(name: "debugState", value: "🌡 Threshold-based updates (${tempThresholdLabel})")

    if (settings?.traceLogging) {
        log.trace "🛠 configure() → Offsets: Temp=${tempOffsetLabel}, Humidity=${humidityOffsetLabel} | Unit: ${tempUnit} | Threshold: ${tempThresholdLabel}"
    } else {
        log.info "🔧 configure() complete - Updates on ${tempThresholdLabel} change"
    }
}

def installed() { 
    state.lastSensorReport = now() 
    configure() 
}

def updated() { 
    sendEvent(name: "debugState", value: (settings?.debugLogging ?: false) ? "ON" : "OFF") 
    sendEvent(name: "traceState", value: (settings?.traceLogging ?: false) ? "ON" : "OFF") 
    def unit = (settings?.tempUnit == "Fahrenheit") ? "°F" : "°C"
    sendEvent(name: "tempOffsetState", value: "${settings?.tempOffset ?: 0.0}${unit}") 
    sendEvent(name: "humidityOffsetState", value: "${settings?.humidityOffset ?: 0.0}%")
    sendEvent(name: "tempChangeThresholdState", value: "${settings?.tempChangeThreshold ?: 0.25}°C")
    configure()
}

def checkBattery() {
    if (debugLogging) log.debug "🔋 Checking battery status"
    return zigbee.readAttribute(0x0001, 0x0021)
}

def logsOff() { 
    log.warn "Debug logging disabled." 
    device.updateSetting("debugLogging", [value:"false", type:"bool"]) 
    sendEvent(name: "debugState", value: "OFF") 
}

def timeoutSeconds() { return 3600 }  // Increased to 1 hour since updates are event-driven

def checkForTimeout() { 
    def last = state.lastSensorReport ?: 0 
    def elapsed = (now() - last) / 1000 
    if (elapsed > timeoutSeconds()) { 
        log.warn "⚠️ No sensor data received in last ${(elapsed/60).toInteger()} minutes. Check Zigbee link or sensor battery." 
    } else { 
        if (debugLogging) log.debug "✅ Sensor data received within timeout (${(elapsed/60).toInteger()} minutes ago)" 
    } 
}
1 Like

Driver code is not really my thing. I mostly just brute force similar drivers to work with my device changing lots of different lines until I can get it to work. I posed a question to Claude AI and this is what it came back with, in case it means anything to you.

Question:
Can you spot any flaws with this code? It is a device driver code running on a hubitat C7 hub and i'm trying to make it work with a eWeLink sensor model: CK-TLSR8656-SS5-01(7014). It seems to not be updating the temperature in the log as the last temp update was 17 hours ago.

Answer:
Looking at your Hubitat device driver code, I can spot several potential issues that could explain why temperature updates aren't being received:

Primary Issues:

1. Fingerprint Mismatch Problem

Your fingerprints have inconsistent cluster ordering:

groovy

// First fingerprint
inClusters:"0000,0001,0003,0004,0020,0402,0405,FC11"

// Second fingerprint  
inClusters:"0001,0003,0402,0405,0000"

The eWeLink sensor expects the first pattern, but cluster order matters for matching. Hubitat is very strict about this.

2. Missing Binding and Reporting Configuration

Your configure() method only sets up refresh scheduling but doesn't configure the sensor to actually send reports:

groovy

def configure() {
    unschedule()
    runEvery15Minutes("scheduledRefresh")
    // Missing: binding and reporting configuration!
}

3. Refresh Won't Work on Sleeping Sensors

Your code correctly notes that the CK-TLSR8656 sleeps between updates, but then tries to refresh it every 15 minutes anyway. This wastes resources and won't work.

Recommended Fixes:

Fix the configure() method:

groovy

def configure() {
    unschedule()
    
    if (debugLogging) log.debug "🔧 Configuring sensor bindings and reporting..."
    
    def cmds = []
    
    // Bind clusters
    cmds += zigbee.configureReporting(0x0402, 0x0000, DataType.INT16, 30, 3600, 10) // Temp every 30s-1hr, change of 0.1°C
    cmds += zigbee.configureReporting(0x0405, 0x0000, DataType.UINT16, 30, 3600, 100) // Humidity every 30s-1hr, change of 1%
    cmds += zigbee.configureReporting(0x0001, 0x0021, DataType.UINT8, 3600, 21600, 1) // Battery every 1-6hrs, change of 1%
    
    // Remove the automatic refresh since sensor sleeps
    // runEvery15Minutes("scheduledRefresh")  // Comment this out
    
    if (debugLogging) log.debug "🔧 Configure complete - sensor should now report automatically"
    
    return cmds
}

Fix the fingerprint ordering:

Make sure your device's actual cluster order matches exactly. You can check this in the Hubitat device page under "Data" section.

Check device pairing:

  1. Look at your device's "Data" section in Hubitat
  2. Verify the inClusters value matches your fingerprint exactly
  3. If not, update the fingerprint to match

Debugging steps:

  1. Enable debug logging
  2. Check if diagnoseFingerprintMatch() shows a successful match
  3. If not matched, the sensor might not be using this driver at all
  4. Try re-pairing the device after fixing the fingerprint

The main issue is likely that the sensor isn't properly configured to send automatic reports, so it's only sending data when manually triggered (like pressing the reset button). The configure method needs to tell the sensor "send me temperature updates every X minutes" rather than trying to pull data from a sleeping device.

Hopefully it helps you in some way.

1 Like

Thank you for those suggestions from Claude.

I have now applied the suggestions form Claude and changed to a trigger basis for both temperature and humidity and released a new version, that you may wish to try. I have named it the generic general release name. Please give it a go.

Sincerely
Ivan Piacun MIITP CITPNZ

Thanks for that. The driver still does not appear to be working for me. I put both sensors running your new driver in my 3D printer while printing and they have not updated for 5 hours. The only thing that seems to wake them is pushing the reset button once, then it updates the temp readings once.
I'm thinking I will just try and find a seller on Aliexpress who still has the older version (eWeLink SNZB-02) of sensor as I have 2 of those using the generic Hubitat driver and they work perfectly.

Possibly in time as more people buy these, a way of having them work reliably will be found. As I said they work perfectly on smart-things, updating automatically whenever the temp reading changes but I've tried all your driver variants, the generic Hubitat driver and some Claude AI drivers and the only times it worked reliably, it updated the readings hourly (Claude AI driver), which is no good for me.
My older SNZB-02's update 4-5 times a minute (as the temp changes), which I need for climate control.

Thanks for your help.

I am changing to the ONENUO Tuya Zigbee Smart Temperature & Humidity Sensor from AliExpress. As I also have not much luck.

Sincerely Ivan Piacun MIITP CITPNZ

Just tried Claude, so much better than Co-Pilot. Just a shame that free use is limited.

1 Like

I too have bought 2 of these. I'm using kkossev's driver on them but I am still having problems. It reports once and then goes offline. Might have to find a different driver for it. Which one are you using?

I am using the latest version of my driver that incorporates the Claude changes with the
ONENUO Tuya Zigbee Smart Temperature & Humidity Sensor from AliExpress which seems to be working better.

Also after the fix of a couple of bugs in the driver it appears to be now sensing temperature correctly with the Tuya Zigbee CK-TLSR8656 Temperature-Humidity Sensor from Manufacturer eWeLink.

Sincerely Ivan Piacun MIITP CITPNZ

1 Like