[Help needed] Fibaro FGK-10x z-wave Door window sensor temperature reporting

Here is a version with sensor offset, I think there are a few more mods required to make this driver nicer...

[EDITED]

/**
 *  Fibaro Z-Wave FGK-101 Temperature & Door/Window Sensor Handler [v0.9.5.4, 3 December 2018]
 *		
 *  Copyright 2014 Jean-Jacques GUILLEMAUD
 *
 *  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.
 *
 */
 
/******************************************************************************************************************************
 *	Fibaro Z-Wave FGK-101 Marketing Description is at :
 *		http://www.fibaro.com/en/the-fibaro-system/door-window-sensor
 *
 *  Fibaro FGK-10x Operating Manual can be downloaded at :
 *		http://www.fibaro.com/files/instrukcje/eng/DoorWindowSensor%20FGK-101-107%20ENG_v21-v23.pdf
 *
 *	The current version of this Handler is parameterized to force Device's wakeup :
 *		- on any open<->closed state change
 *		- in case of Tampering Alarm triggering
 *		- every 60mn (wakeUpIntervalSet(seconds:60*60), hard coded)
 *		- whenever Temperature delta change since last report is greater than 0.31°C (Parameter#12, hard coded)
 *		also :
 *		- Temperature is natively reported by sensor in Celsius (SensorMultilevelReport[scale:0]);
 *		  convertion is needed for Fahrenheit display 
 *
 *  A few specificities of this device that are relevant to better understand some parts of this Handler :
 *		- it is a battery operated device, so Commands can only be sent to it whenever it wakes up
 *		- it is a multi-channel Device, and the multi-level temperature sensor reports only from EndPoint#2
 *		- specific configurable parameters are documented in the above Operating Manual
 *		- some of those parameters must be modified to activate the anti-Tampering Alarm
 *		- some of the "scaffolding" has been left in place as comments, since it may help other people to understand/modify this Handler
 *		- BEWARE : the optional DS18B20 sensor must be connected BEFORE the Device is activated (otherwise, reset the Device)
 *		- IMPORTANT : for debugging purpose, it is much better to change the wake-up period from the default 60mn to 1mn or so;
 *					but unless you force the early wake up of the sensor (forcing open/closed for instance), you will have to
 *					wait up to 60mn for the new value to become effective.
 *
 * Z-Wave Device Class: GENERIC_TYPE_SENSOR_BINARY / SPECIFIC_TYPE_ROUTING_SENSOR_BINARY
 * FGK-101 Raw Description [EndPoint:0] : "0 0 0x2001 0 0 0 c 0x30 0x9C 0x60 0x85 0x72 0x70 0x86 0x80 0x84 0x7A 0xEF 0x2B"
 * Command Classes supported according to Z-Wave Certificate ZC08-14070004 for FGK-101\US :
 * 	Used in Handler :
 *		- 0x20 - 32  : BASIC					V1
 *		  0x30 - 48  : SENSOR_BINARY			!V1! V2
 *		- 0x31 - 49  : SENSOR_MULTILEVEL		V1 !V2! V3 V4 V5
 *		- 0x56 - 86  : CRC_16_ENCAP				V1
 *		  0x60 - 96  : MULTI_CHANNEL			V3
 *		  0x70 - 112 : CONFIGURATION			V1 !V2!
 *		  0x72 - 114 : MANUFACTURER_SPECIFIC 	V1 !V2!
 *		  0x80 - 128 : BATTERY					V1
 *		  0x84 - 132 : WAKE_UP					V1 !V2!
 *		  0x85 - 133 : ASSOCIATION				V1 !V2!
 *		  0x86 - 134 : VERSION					V1
 *		  0x98 - 152 : SECURITY					V1 [only latest versions of FGK-101]
 *		  0x9C - 156 : SENSOR_ALARM				V1
 *	NOT used in Handler :
 *		  0x2B - 43  : SCENE_ACTIVATION			V1	
 *
 *	 also found in FGK-101 Raw Description, in addition to Z-Wave Certificate for FGK-101\US [?!!] :
 *		+ 0x7A - 122 : FIRMWARE_UPDATE_MD		V1 V2
 *		+ 0xEF - 239 : MARK  					V1
 ******************************************************************************************************************************/

/******************************************************************************************************************************
 *	List of Known Bugs / Oddities / Missing Features :
 *		- valueTitle does not show displayNames on mobile Dashboard/Things page;
 *		  attempted workaround using : valueTile(){unit:'${displayName}') failed
 *		- valueTile behaves differently on mobile Dashboard (interpolated colors) from Simulator (step-wise colors)
 *		- using Preferences values instead of hard-coded values for some parameters would be nicer
 *****************************************************************************************************************************/

metadata {
	definition (name: "JJ's Fibaro FGK-101 Handler", namespace: "JJG2014", author: "Jean-Jacques GUILLEMAUD") {
		capability "Contact Sensor"
		capability "Battery"
		capability "Configuration"
		capability "Temperature Measurement"
		capability "Sensor"
		capability "Alarm"
        
        command "reportNext", ["string"]
        command "test"

        
        attribute "reportASAP", "number"
        attribute "deviceTime", "number"

        // FGK-101 Raw Description [EndPoint:0] : "0 0 0x2001 0 0 0 c 0x30 0x9C 0x60 0x85 0x72 0x70 0x86 0x80 0x84 0x7A 0xEF 0x2B"
		fingerprint deviceId: "0x2001", inClusters: "0x30, 0x60, 0x70, 0x72, 0x80, 0x84, 0x85, 0x9C"  // should include "0x20, 0x31" too ?!!
	}
	preferences {
		input "debugLevel", "enum", title: "<b>Debug Level?</b>", options: ["1","2"], defaultValue: "2", required: true
   		input name:"wakeUpInterval", type:"number", title: "<b>Wakeup Interval?</b>", description:"minutes", defaultValue:60, range: "0..255", required: true
		input name:"sensorOffset", type:"decimal", title:"<b>Sensor Temperature Offset</b>", description:"degrees", defaultValue:0.0, range: "-20..20"
    }
}

def test() {
    parse("zw device: 14, command: 8407, payload: , isMulticast: false")
    parse("zw device: 16, command: 600D, payload: 02 02 31 05 01 44 00 00 0B 79 , isMulticast: false")
    parse("zw device: 16, command: 2001, payload: 00 , isMulticast: false")
    parse("zw device: 16, command: 3003, payload: 00 , isMulticast: false")
    parse("zw device: 14, command: 7006, payload: 0F 01 00 , isMulticast: false")
    parse("zw device: 14, command: 9C02, payload: 14 00 FF 00 00 , isMulticast: false")
    parse("zw device: 14, command: 9C02, payload: 14 00 00 00 00 , isMulticast: false")
    parse("zw device: 16, command: 600D, payload: 02 02 31 05 01 44 00 00 05 79 , isMulticast: false")    
}

////////////////////////////////
// parse events into attributes
////////////////////////////////
def parse(String description) {
		state.parseCount=state.parseCount+1
		if (debugLevel>=1) {log.debug "--------------------------Parsing... ; state.parseCount: ${state.parseCount}--------------------------"}
		if (debugLevel>=2) {log.debug "Parsing... '${description}'"}
        def result = null
        def cmd = zwave.parse(description, [0x20:1, 0x30:1, 0x31:2, 0x56:1, 0x60:3, 0x70:2, 0x72:2, 0x80:1, 0x84:2, 0x85:2, 0x9C:1])
        if (cmd) {
                result = zwaveEvent(cmd)
                if (debugLevel>=1) {log.debug "Parsed ${cmd} to ${result.inspect()}"}
        } else {
                log.debug "Non-parsed event: ${description}"
        }
        return result
}


def temperatureScaleFC(tempvalue) {
	//FGK-101 is natively °C; convert to °F if selected in settings
	def float tempFC = tempvalue
	if (location.temperatureScale == "F") {
		tempFC = tempvalue * 1.8 + 32
	}
	return tempFC
}

def wakeUpResponse(cmdBlock) {
	//Initialization... (executed only once, when the Handler has been updated)
    //All untouched parameters are supposed to be DEFAULT (as factory-set)
    if (state.isInitialized == false) {
    	if (debugLevel>=2) {log.debug "state.isInitialized : ${state.isInitialized}"}
        cmdBlock << zwave.wakeUpV2.wakeUpIntervalSet(seconds:wakeUpInterval*60, nodeid:zwaveHubNodeId).format() // NB : may have to wait 60mn for that value to be refreshed !
        cmdBlock << "delay 1200"
        // NOTE : any asynchronous temperature query thru SensorMultilevelGet() does NOT reset the delta-Temp base value (managed by DS18B20 hardware)
        // Adjust temperature report sensitivity for outside thermometers whose displayName starts with "*"
        def byte tempQuantumSixteenth
    	if (device.displayName.substring(0,1).equals("*")) {
        	tempQuantumSixteenth = 16	/* 16/16=1°C = 1.8°F */
        } else {
        	tempQuantumSixteenth = 5	/* 5/16=0.31°C = 0.56°F */
        }
        cmdBlock << zwave.configurationV2.configurationSet(parameterNumber: 12/*for FGK101*/, size: 1, configurationValue: [tempQuantumSixteenth]).format()
        cmdBlock << "delay 1200"     
        // inclusion of Device in Association#3 is needed to get delta-Temperature notification messages [cf Parameter#12 above]
        cmdBlock << zwave.associationV2.associationSet(groupingIdentifier:3, nodeId:[zwaveHubNodeId]).format()
        cmdBlock << "delay 1200"
        // inclusion of Device in Association#2 is needed to enable SensorAlarmReport() Command [anti-Tampering protection]
        cmdBlock << zwave.associationV2.associationSet(groupingIdentifier:2, nodeId:[zwaveHubNodeId]).format()
        cmdBlock << "delay 1200"
        // inclusion of Device in Association#4 is needed for backward compatibility with non Z-Wave+ controlers
        cmdBlock << zwave.associationV2.associationSet(groupingIdentifier:4, nodeId:[zwaveHubNodeId]).format()
        cmdBlock << "delay 1200"
        // inclusion of Device in Association#5 is needed for backward compatibility with non Z-Wave+ controlers
        cmdBlock << zwave.associationV2.associationSet(groupingIdentifier:5, nodeId:[zwaveHubNodeId]).format()
        cmdBlock << "delay 1200"
        state.isInitialized = true
        if (debugLevel>=2) {log.debug "state.isInitialized : ${state.isInitialized}"}
    }
    
	//Regular Commands...
    def long nowTime = new Date().getTime()
    // Next line needed because "update()" does not seem to work anymore
    state.batteryInterval = (long) (24*60-45)*60*1000  // 1 day
    if (nowTime-state.lastReportBattery > state.batteryInterval) {
		cmdBlock << zwave.batteryV1.batteryGet().format()
        cmdBlock << "delay 1200"
        //next 2 lines redondant since any open/closed status change is asynchronously notified... but useful in case of missing basicSet notification
    	cmdBlock << zwave.basicV1.basicGet().format()
    	cmdBlock << "delay 1200"
    }

    cmdBlock << zwave.wakeUpV2.wakeUpIntervalGet().format() // NB : may have to wait 60mn for that value to be refreshed !
    cmdBlock << "delay 1200"
    cmdBlock << zwave.multiChannelV3.multiChannelCmdEncap(sourceEndPoint: 2, destinationEndPoint: 2, commandClass:0x31/*Sensor Multilevel*/, command:4/*Get*/).format()
    cmdBlock << "delay 1200"
    cmdBlock << zwave.wakeUpV2.wakeUpNoMoreInformation().format()
    cmdBlock << "delay 2000"
    if (debugLevel>=2) {
        log.debug "wakeUpNoMoreInformation()"
        log.debug "cmdBlock : ${cmdBlock}"
    }
    return cmdBlock
}

def zwaveEvent(hubitat.zwave.commands.wakeupv2.WakeUpNotification cmd) {
		// IMPORTANT NOTE : when the batteryLevel becomes too low, Device reports become erratic, all periodic wakeUpNotifications stop
        // and consequently BATTERYLEVEL IS NOT UPDATED ANYMORE every 24 hours, continuing to display the last (and obsolete) reported value.
        // Curiously, asynchronous sensorMultilevelReports continue to arrive, for some time, making the Device look (partially) "alive"
    	if (debugLevel>=2) {log.debug "wakeupv2.WakeUpNotification $cmd"}
        def event = sendEvent(descriptionText: "${device.displayName} woke up", isStateChange: true, displayed: false)
        def cmdBlock = []
        cmdBlock=wakeUpResponse(cmdBlock)
        return [event, response(cmdBlock)]
}

def zwaveEvent(hubitat.zwave.commands.sensormultilevelv2.SensorMultilevelReport cmd) {
	// IMPORTANT NOTE : when the batteryLevel becomes too low, Device reports become erratic, all periodic wakeUpNotifications stop
	// and consequently BATTERYLEVEL IS NOT UPDATED ANYMORE every 24 hours, continuing to display the last (and obsolete) reported value.
	// Curiously, asynchronous sensorMultilevelReports continue to arrive, for some time, making the Device look (partially) "alive"
	// This section resets the displayed battery level to 1% when the battery level is obsolete by more than 48h.
    state.batteryInterval = (long) (24*60-45)*60*1000  // 1 day
    def long nowTime = new Date().getTime()
    if (nowTime-state.lastReportBattery > 3*state.batteryInterval) {  // reset batteryLevel to 1% if no update for 48-72 hours
    	log.debug "obsolete (likely low) battery value : ${((nowTime-state.lastReportBattery)/3600000)} hours old"
        sendEvent(name: "battery", displayed: true, isStateChange:true, unit: "%", value: 1, descriptionText: "${device.displayName} has a low battery")
	    state.lastReportBattery = nowTime
	}
			//  Dirty temporary recovery fix for remote Devices which lost wakeUp capability but still get asynchromous SensorMultilevelReports
			//  Forcing with the magnet a close/open transition after replacing the battery should (in most cases...) restore wakeUps
                //def cmdBlock = []
        		//cmdBlock=wakeUpResponse(cmdBlock)
        		//return [response(cmdBlock)]
        		//configure()
        def float scaledSensorValue = cmd.scaledSensorValue
        // Adjust measured temperature based on previous manual calibration; FGK-101 is natively °C
        switch (device.name) {
            case 'T005' :										//JJG	
            	scaledSensorValue = scaledSensorValue + 0.0554
    			log.debug "Temp Adjust for : ${device.name}"
                break;
            case 'T006' :										//MLE
            	scaledSensorValue = scaledSensorValue + 0.0297
    			log.debug "Temp Adjust for : ${device.name}"
                break;
            case 'T003' :										//MPT
            	scaledSensorValue = scaledSensorValue - 0.0603
    			log.debug "Temp Adjust for : ${device.name}"
                break;
            case 'T002' :										//NBN	
            	scaledSensorValue = scaledSensorValue - 0.0758
    			log.debug "Temp Adjust for : ${device.name}"
                break;
            case 'T004' :										//SCU
            	scaledSensorValue = scaledSensorValue + 0.0011
    			log.debug "Temp Adjust for : ${device.name}"
                break;
            case 'T007' :										//FSU
            	scaledSensorValue = scaledSensorValue + 0.0025
    			log.debug "Temp Adjust for : ${device.name}"
                break;
            case 'T008' :										
            	scaledSensorValue = scaledSensorValue - 0.0146
    			log.debug "Temp Adjust for : ${device.name}"
                break;
            case 'T009' :										
            	scaledSensorValue = scaledSensorValue + 0.0383
    			log.debug "Temp Adjust for : ${device.name}"
                break;
            case 'T010' :										
            	scaledSensorValue = scaledSensorValue + 0.0383
    			log.debug "Temp Adjust for : ${device.name}"
                break;
            case 'T011' :										
            	scaledSensorValue = scaledSensorValue - 0.0889
    			log.debug "Temp Adjust for : ${device.name}"
                break;
            case 'T012' :										
            	scaledSensorValue = scaledSensorValue - 0.0532
    			log.debug "Temp Adjust for : ${device.name}"
                break;
            case 'T013' :										
            	scaledSensorValue = scaledSensorValue + 0.0383
    			log.debug "Temp Adjust for : ${device.name}"
                break;
            case 'T014' :										//*ext*//
            	scaledSensorValue = scaledSensorValue - 0.0160
    			log.debug "Temp Adjust for : ${device.name}"
                break;
        }
    
        scaledSensorValue = scaledSensorValue + 1.0*sensorOffset 
    
        //Round to nearest 1 decimal temperature value; convert to °F if needed
        def float ftempSign = temperatureScaleFC(scaledSensorValue) < 0 ? -1 : +1
		def float ftemp = ftempSign * ((((temperatureScaleFC(scaledSensorValue).abs()*100+5)/10).intValue()*1.0)/10)
        if (debugLevel>=2) {
        	log.debug "ftempSign : ${ftempSign}"
        	log.debug "ftemp : ${ftemp}"
        }
        // Next line needed because "update()" does not seem to work anymore
    	state.maxEventInterval = (long) (4*60-10)*60*1000  // at least 1 Temperature Report event every 4 hours
        nowTime = new Date().getTime()
        if (debugLevel>=2) {
        	log.debug "cmd.scaledSensorValue : ${cmd.scaledSensorValue}"
        	log.debug "correction : ${scaledSensorValue-cmd.scaledSensorValue}"
    		log.debug "device.displayName : ${device.displayName}"
    		log.debug "'Date().getTime()' : ${new Date().getTime()}"
            log.debug "state.forcedWakeUp : ${state.forcedWakeUp}"
            log.debug "state.maxEventInterval : ${state.maxEventInterval}"
    		log.debug "state.lastReportTime : ${state.lastReportTime}"
    		log.debug "nowTime : ${nowTime}"
    		log.debug "(nowTime-state.lastReportTime > state.maxEventInterval) : ${(nowTime-state.lastReportTime > state.maxEventInterval)}"
    		log.debug "ftemp : ${ftemp}"
            log.debug "state.lastReportedTemp: ${state.lastReportedTemp}"
        }
        // Adjust temperature report sensitivity for outside thermometers whose displayName starts with "*"
        def float tempQuantum
    	if (device.displayName.substring(0,1).equals("*")) {
        	tempQuantum = temperatureScaleFC(0.9999)-temperatureScaleFC(0)
        } else {
        	tempQuantum = temperatureScaleFC(0.2999)-temperatureScaleFC(0)
        }
        log.debug "((ftemp-state.lastReportedTemp).abs()>${tempQuantum}): ${(ftemp-state.lastReportedTemp).abs()>tempQuantum}"
        if (((ftemp-state.lastReportedTemp).abs()>tempQuantum) || ((nowTime-state.lastReportTime) > state.maxEventInterval) || state.forcedWakeUp) {
        	def map = [ displayed: true, value: ftemp.toString(), isStateChange:true, linkText:"${device.displayName}" ]
        	switch (cmd.sensorType) {
                case 1:
                        map.name = "temperature"
                        map.unit = cmd.scale == 1 ? "F" : "C"
                        //ignores Device's native temperature scale, ftemp already converted to °F if settings as such
                        map.unit = location.temperatureScale
                        log.debug "map.value : ${map.value}"
                        log.debug "map.unit : ${map.unit}"
                        break;
        	}
			if (debugLevel>=2) {
        		log.debug "temperature Command : ${map.inspect()}"
        	}
        	state.lastReportedTemp = ftemp
            state.lastReportTime = nowTime
            state.forcedWakeUp = false
            // For Test purpose; redondant with reportNext() => state.forcedWakeUp=1
            if (device.currentValue('reportASAP')==1) {sendEvent(name: "reportASAP", value: 0, isStateChange: true)}
        	return sendEvent(map)
        }
}

def sensorValueEvent(value) {
	if (value) {
		sendEvent(name: "contact", value: "open", descriptionText: "$device.displayName is open")
	} else {
		sendEvent(name: "contact", value: "closed", descriptionText: "$device.displayName is closed")
	}
}

// BasicReport should not be necessary since all status change notifications are asynchronous via BasicSet
// But useful as defensive programming, in case of missed notifications, to make sure latest change has been properly reported and registered
def zwaveEvent(hubitat.zwave.commands.basicv1.BasicReport cmd) {
	sensorValueEvent(cmd.value)
    if (debugLevel>=2) {log.debug "basicv1.BasicReport $cmd.value"}
    def cmdValue = cmd.value
	return openClosed(cmd, cmdValue)
}

// To check that WakeUpInterval does not revert to 1mn instead of 1h
def zwaveEvent(hubitat.zwave.commands.wakeupv2.WakeUpIntervalReport cmd) {
    if (debugLevel>=2) {log.debug "WakeUpIntervalReport $cmd"}
    if (cmd.seconds!=wakeUpInterval*60) {
    	def result = sendEvent(name:"WakeUpIntervalReport", descriptionText:"${device.displayName} had ${cmd.seconds} seconds wakeUp period", isStateChange:true, displayed:true, linkText:"${device.displayName}")
   		configure()
    }
    return result
}

def openClosed(cmd, cmdValue) {
    def theState = cmdValue == 0 ? "closed" : "open"
    if (debugLevel>=2) {log.debug "openClosed $cmd"}
    // Use closed/open sensor notification to trigger push of updated Temperature value and immediate setting of updated device parameters
    // Sometimes, Temperature forced refresh stops working : SensorMultilevelGet() Commands are stacked but not executed immediately;
    // will restart after some time, and stacked Commands will be executed !
    def event = sendEvent(name:"contact", value:"${theState}", descriptionText:"${device.displayName} is ${theState}", isStateChange:true, displayed:true, linkText:"${device.displayName}")
    state.forcedWakeUp = true
    def cmdBlock = []
    cmdBlock=wakeUpResponse(cmdBlock)
    return [event, response(cmdBlock)]
}
    
def zwaveEvent(hubitat.zwave.commands.basicv1.BasicSet cmd) {
    if (debugLevel>=2) {log.debug "basicv1.BasicSet $cmd"}
    def cmdValue = cmd.value
	return openClosed(cmd, cmdValue)
}

// SensorBinaryReport should never occur since all status change notifications are asynchronous via BasicSet
def zwaveEvent(hubitat.zwave.commands.sensorbinaryv1.SensorBinaryReport cmd) {
    if (debugLevel>=2) {log.debug "sensorbinaryv1.SensorBinaryReport $cmd"}
    def cmdValue = cmd.sensorValue
	return openClosed(cmd, cmdValue)
}

def zwaveEvent(hubitat.zwave.commands.sensoralarmv1.SensorAlarmReport cmd) {
	//def event = sensorValueEvent(cmd.sensorState)
    if (debugLevel>=2) {log.debug "sensoralarmv1.SensorAlarmReport $cmd.sensorState"}
    def event = sendEvent(name:"alarm", descriptionText:"${device.displayName} is tampered with !", isStateChange:true, displayed:true, linkText:"${device.displayName}")
    def cmdBlock = []
    state.forcedWakeUp = true
    cmdBlock=wakeUpResponse(cmdBlock)
    return [event, response(cmdBlock)]
}


def zwaveEvent(hubitat.zwave.commands.batteryv1.BatteryReport cmd) {
    // Next line needed because "update()" does not seem to work anymore
    state.batteryInterval = (long) (24*60-45)*60*1000  // 1 day
    def long nowTime = new Date().getTime()
    if (debugLevel>=2) {
    	log.debug "batteryv1.BatteryReport ${cmd.batteryLevel}"
    	log.debug "nowTime : ${nowTime}"
    	log.debug "state.lastReportBattery : ${state.lastReportBattery}"
    	log.debug "state.batteryInterval : ${state.batteryInterval}"
        log.debug "state.forcedWakeUp : ${state.forcedWakeUp}"
    }
    if ((nowTime-state.lastReportBattery > state.batteryInterval) || state.forcedWakeUp) {
		def map = [ name: "battery", displayed: true, isStateChange:true, unit: "%" ]
		if (cmd.batteryLevel == 0xFF) {
			map.value = 1
			map.descriptionText = "${device.displayName} has a low battery"
			map.isStateChange = true
		} else {
			map.value = cmd.batteryLevel
		}
    	state.lastReportBattery = nowTime
        log.debug "battery map : ${map}"
    	return [sendEvent(map)]
    }
}

def zwaveEvent(hubitat.zwave.commands.configurationv2.ConfigurationReport cmd) {
    if (debugLevel>=2) {log.debug "ConfigurationReport - Parameter#${cmd.parameterNumber}: ${cmd.configurationValue}"}
}

def zwaveEvent(hubitat.zwave.commands.multichannelv3.MultiChannelEndPointReport cmd) {
    if (debugLevel>=2) {log.debug "multichannelv3.MultiChannelCapabilityReport: ${cmd}"}
}

def zwaveEvent(hubitat.zwave.commands.multichannelv3.MultiChannelCapabilityReport cmd) {
    if (debugLevel>=2) {log.debug "multichannelv3.MultiChannelCapabilityReport: ${cmd}"}
}
 
def zwaveEvent(hubitat.zwave.commands.versionv1.VersionReport cmd) {
    if (debugLevel>=2) {log.debug "versionv1.VersionReport: ${cmd}"}
}
 
// MultiChannelCmdEncap and MultiInstanceCmdEncap are ways that devices can indicate that a message
// is coming from one of multiple subdevices or "endpoints" that would otherwise be indistinguishable
def zwaveEvent(hubitat.zwave.commands.multichannelv3.MultiChannelCmdEncap cmd) {
        def encapsulatedCommand = cmd.encapsulatedCommand([0x30: 1, 0x31: 2]) // can specify command class versions here like in zwave.parse
        if (debugLevel>=2) {log.debug ("Command from endpoint ${cmd.sourceEndPoint}: ${encapsulatedCommand}")}
        if (encapsulatedCommand) {
                return zwaveEvent(encapsulatedCommand)
        }
}

// Catch All command Handler in case of unexpected message
def zwaveEvent(hubitat.zwave.Command cmd) {
	sendEvent(descriptionText: "!!! $device.displayName: ${cmd}", displayed: false)
}

// When a Temperature Event got lost in transit, the Watchdog requests a forced report at next wake up
// The "reportNext()" alarm command is used to signal back from the Watchdog SmartApp to the sleepy Device Handler
def reportNext(commandMsg) {
	log.debug "reportNext !"
    log.debug "commandMsg : ${commandMsg}"
    state.forcedWakeUp = true
		// IMPORTANT NOTE : when the batteryLevel becomes too low, Device reports become erratic, all periodic wakeUpNotifications stop
        // and consequently BATTERYLEVEL IS NOT UPDATED ANYMORE every 24 hours, continuing to display the last (and obsolete) reported value.
        // Curiously, asynchronous sensorMultilevelReports continue to arrive, for some time, making the Device look (partially) "alive"
    	// This section resets the displayed battery level to 1% when the battery level is obsolete by more than 48h.
	// Next line may be needed because "update()" does not seem to work reliably anymore
    state.batteryInterval = (long) (24*60-45)*60*1000  // 1 day
    def long nowTime = new Date().getTime()
    if (nowTime-state.lastReportBattery > 3*state.batteryInterval) {  // reset batteryLevel to 1% if no update for 48-72 hours
    	log.debug "obsolete (likely low) battery value : ${((nowTime-state.lastReportBattery)/3600000)} hours old"
        sendEvent(name: "battery", displayed: true, isStateChange:true, unit: "%", value: 1, descriptionText: "${device.displayName} has a low battery")
	    state.lastReportBattery = nowTime
	}
	return []
}

///////////////////
// For Tests Purpose
///////////////////

// Executed each time the Handler is updated
def updated() {
	log.debug "Updated !"
    // All state.xxx attributes are Device-local, NOT Location-wide
    state.isInitialized = false
    state.lastReportedTemp = (float) -1000
    state.lastReportTime = (long) 0
    state.lastReportBattery = (long) 0
	// Real-time clock of sensors (ceramic resonator) is up to 3% inaccurate
    state.batteryInterval = (long) (24*60-45)*60*1000  // 1 Battery Report event every 24 hours, rounded up to the nearest hourly wakeup
    state.maxEventInterval = (long) (4*60-10)*60*1000  // at least 1 Temperature Report event every 3:50 hours
    state.parseCount=(int) 0
    state.forcedWakeUp = true
    if (!(state.deviceID)) {state.deviceID = device.name}
    log.debug "state.deviceID: ${state.deviceID}"
    log.debug "state.batteryInterval : ${state.batteryInterval}"
    log.debug "state.maxEventInterval : ${state.maxEventInterval}"
    // For Test purpose; redondant with reportNext() => state.forcedWakeUp=1
    sendEvent(name: "reportASAP", value: 1, isStateChange: true)
    log.debug "device.currentValue('reportASAP') : ${device.currentValue('reportASAP')}"

    infos()
}


// If you add the Configuration capability to your device type, this command will be called right
// after the device joins to set device-specific configuration commands.
def configure() {
	log.debug "Configuring..."
    // Adjust temperature report sensitivity for outside thermometers whose displayName starts with "*"
    def byte tempQuantumSixteenth
    log.debug "device.displayName.substring(0,1) : ${device.displayName.substring(0,1)}"
    if (device.displayName.substring(0,1).equals("*")) {
    	tempQuantumSixteenth = 16	/* 16/16=1°C = 1.8°F */
    } else {
    	tempQuantumSixteenth = 5	/* 5/16=0.31°C = 0.56°F */
    }
    log.debug "tempQuantumSixteenth : ${tempQuantumSixteenth}"
	delayBetween([
		// Make sure sleepy battery-powered sensors send their WakeUpNotifications to the hub
		zwave.wakeUpV2.wakeUpIntervalSet(seconds:wakeUpInterval*60, nodeid:zwaveHubNodeId).format(),
		// NOTE : any asynchronous temperature query thru SensorMultilevelGet() does NOT reset the delta-Temp base value (managed by DS18B20 hardware)
		zwave.configurationV2.configurationSet(parameterNumber: 12/*for FGK101*/, size: 1, configurationValue: [tempQuantumSixteenth]).format(),
        // inclusion of Device in Association#3 is needed to get delta-Temperature notification messages [cf Parameter#12 above]
        zwave.associationV2.associationSet(groupingIdentifier:3, nodeId:[zwaveHubNodeId]).format(),
        // inclusion of Device in Association#2 is needed to enable SensorAlarmReport() Command [anti-Tampering protection]
        zwave.associationV2.associationSet(groupingIdentifier:2, nodeId:[zwaveHubNodeId]).format(),
        // get zwave version information
        zwave.versionV1.versionGet().format()
	],1200)
}

def infos() {
	if (!state.devices) { state.devices = [:] }
    log.debug "zwaveHubNodeId: ${zwaveHubNodeId}"					// -> "1"
    log.debug "device.displayName: ${device.displayName}"			// -> "JJG"
    log.debug "device.id: ${device.id}"							// -> "75841488-ae76-4cac-b523-a2694e72c25a"
    log.debug "device.name: ${device.name}"						// -> "T001"
    log.debug "device.label: ${device.label}"						// -> "JJG"
    log.debug "device.data: ${device.data}"   					// -> "[endpointId:0, version: 2.1, MSR:010F-0700-2000]"
    //log.debug "'device.rawDescription': ${device.rawDescription}"	// -> "0 0 0x2001 0 0 0 c 0x30 0x9C 0x60 0x85 0x72 0x70 0x86 0x80 0x84 0x7A 0xEF 0x2B"
}

1 Like

Hi @christi999 and @denwood,

I'm following this thread with great attention as I have the same issue with the same device. Big thank you to @christi999 for putting in time and effort to fix our issue.
I installed the latest code from @christi999 and hurray, getting a temp reading for the first time!

Few things I noticed:

  • first time, the wakeUp interval was not defined in code (although the field contained "60"). This caused multiply by null errors. Solved after saved the preferences. This is an easy one and not blocking.
dev:5762022-09-21 15:18:11.607 errorjava.lang.NullPointerException: Cannot invoke method multiply() on null object on line 359 (method parse)
dev:5762022-09-21 15:17:35.778 errorjava.lang.NullPointerException: Cannot invoke method multiply() on null object on line 525 (method configure)
  • multiple open/close events per physical open/close
contact	closed		Zwembad temperatuur is closed	DEVICE		2022-09-21 15:33:43.167 CEST
contact	closed		Zwembad temperatuur is closed	DEVICE		2022-09-21 15:33:43.120 CEST
contact	open		Zwembad temperatuur is open	DEVICE		2022-09-21 15:33:39.505 CEST
contact	open		Zwembad temperatuur is open	DEVICE		2022-09-21 15:33:38.047 CEST
contact	open		Zwembad temperatuur is open	DEVICE		2022-09-21 15:33:33.045 CEST
contact	open		Zwembad temperatuur is open	DEVICE		2022-09-21 15:33:32.989 CEST
  • temp reporting is not updating from the initial read of 21.8 (scaledSensorValue: 21.75) which is about right. I keep getting the same reading for both interval and manual wakeup.
dev:5762022-09-21 15:21:17.847 debugCommand from endpoint 2: SensorMultilevelReport(precision:2, scale:0, sensorType:1, sensorValue:[0, 0, 8, 127], size:4, scaledSensorValue:21.75)
  • a LOT of log messages - this is good when debugging of course :wink:

Thanks so much for your support @christi999 ! :pray:

1 Like

I am seeing temp readings in the Event logs, but only reported after a temp change...which is great :slight_smile:

They are most likely sent by the device (basicSet+SensorBinaryReport maybe). Post the corresponding logs so we can see what triggers them. Maybe this can be controlled by the device settings, which I think should be exposed in the device preferences.

1 Like

First of all, this was the one thing I knew would be an issue with ST to HE migration, so a big thanks again @christi999

I have three of the FGK-10x (2.5 firmware) sensors installed and using your latest iteration driver...all good. They are reporting temps as expected. The 3xAA setup and 5V solar cell have been running these sensors for about three years now and remain outside over winter with temps below -35C. It's about 4.2 volts which they seem happy with. The lithium cells don't survive long with the pool solar system running as temp reports happen pretty often...with the AA/solar setup they have a lot more power than they need.

They are used to compare roof vs pool water temps to run the system. I also calculate live BTU using the difference between solar input/output and send this data out via Hundredgraphs so I can keep tabs on the system. Just need to sort the Webcore stuff out and the migration to HE will be complete :slight_smile:

Using a thermowell and fittings to install the sensors into the pool plumbing:

1 Like

I made a few changes in this version:

  • Logging enable/disable/level in preferences
  • Sensor settings in preferences
  • Added driver versioning
  • Getting/displaying sensor firmware version // Not sure about displayed format...
  • Initialize all the sensor parameters on first wake-up of the device
  • Cleaned-up unused code for Hubitat application

I hope I didn't break anything...

/**
 *  Fibaro Z-Wave FGK-101 Temperature & Door/Window Sensor Handler [v0.9.5.4, 3 December 2018]
 *		
 *  Copyright 2014 Jean-Jacques GUILLEMAUD
 *
 *  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.
 *
 */
 
/******************************************************************************************************************************
 *	Fibaro Z-Wave FGK-101 Marketing Description is at :
 *		http://www.fibaro.com/en/the-fibaro-system/door-window-sensor
 *
 *  Fibaro FGK-10x Operating Manual can be downloaded at :
 *		http://www.fibaro.com/files/instrukcje/eng/DoorWindowSensor%20FGK-101-107%20ENG_v21-v23.pdf
 *
 *	The current version of this Handler is parameterized to force Device's wakeup :
 *		- on any open<->closed state change
 *		- in case of Tampering Alarm triggering
 *		- every 60mn (wakeUpIntervalSet(seconds:60*60), hard coded)
 *		- whenever Temperature delta change since last report is greater than 0.31°C (Parameter#12, hard coded)
 *		also :
 *		- Temperature is natively reported by sensor in Celsius (SensorMultilevelReport[scale:0]);
 *		  convertion is needed for Fahrenheit display 
 *
 *  A few specificities of this device that are relevant to better understand some parts of this Handler :
 *		- it is a battery operated device, so Commands can only be sent to it whenever it wakes up
 *		- it is a multi-channel Device, and the multi-level temperature sensor reports only from EndPoint#2
 *		- specific configurable parameters are documented in the above Operating Manual
 *		- some of those parameters must be modified to activate the anti-Tampering Alarm
 *		- some of the "scaffolding" has been left in place as comments, since it may help other people to understand/modify this Handler
 *		- BEWARE : the optional DS18B20 sensor must be connected BEFORE the Device is activated (otherwise, reset the Device)
 *		- IMPORTANT : for debugging purpose, it is much better to change the wake-up period from the default 60mn to 1mn or so;
 *					but unless you force the early wake up of the sensor (forcing open/closed for instance), you will have to
 *					wait up to 60mn for the new value to become effective.
 *
 * Z-Wave Device Class: GENERIC_TYPE_SENSOR_BINARY / SPECIFIC_TYPE_ROUTING_SENSOR_BINARY
 * FGK-101 Raw Description [EndPoint:0] : "0 0 0x2001 0 0 0 c 0x30 0x9C 0x60 0x85 0x72 0x70 0x86 0x80 0x84 0x7A 0xEF 0x2B"
 * Command Classes supported according to Z-Wave Certificate ZC08-14070004 for FGK-101\US :
 * 	Used in Handler :
 *		- 0x20 - 32  : BASIC					V1
 *		  0x30 - 48  : SENSOR_BINARY			!V1! V2
 *		- 0x31 - 49  : SENSOR_MULTILEVEL		V1 !V2! V3 V4 V5
 *		- 0x56 - 86  : CRC_16_ENCAP				V1
 *		  0x60 - 96  : MULTI_CHANNEL			V3
 *		  0x70 - 112 : CONFIGURATION			V1 !V2!
 *		  0x72 - 114 : MANUFACTURER_SPECIFIC 	V1 !V2!
 *		  0x80 - 128 : BATTERY					V1
 *		  0x84 - 132 : WAKE_UP					V1 !V2!
 *		  0x85 - 133 : ASSOCIATION				V1 !V2!
 *		  0x86 - 134 : VERSION					V1
 *		  0x98 - 152 : SECURITY					V1 [only latest versions of FGK-101]
 *		  0x9C - 156 : SENSOR_ALARM				V1
 *	NOT used in Handler :
 *		  0x2B - 43  : SCENE_ACTIVATION			V1	
 *
 *	 also found in FGK-101 Raw Description, in addition to Z-Wave Certificate for FGK-101\US [?!!] :
 *		+ 0x7A - 122 : FIRMWARE_UPDATE_MD		V1 V2
 *		+ 0xEF - 239 : MARK  					V1
 *
 * Version Control:
 *
 *     0.1 - 2022-09-21 - Initial port to Hubitat of @geejiit Github code for ST by christi999@hubitat
 *
 *
 *
 ******************************************************************************************************************************/
public static String version()      {  return "0.1"  }
metadata {
	definition (name: "JJ's Fibaro FGK-101 Handler", namespace: "JJG2014", author: "Jean-Jacques GUILLEMAUD") {
		capability "Contact Sensor"
		capability "Battery"
		capability "Configuration"
		capability "Temperature Measurement"
		capability "Sensor"
		capability "Alarm"
        
        command "reportNext", ["string"]
        command "test"

        
        attribute "reportASAP", "number"
        attribute "deviceTime", "number"
		attribute "driverVersion",  "string"   
        

        // FGK-101 Raw Description [EndPoint:0] : "0 0 0x2001 0 0 0 c 0x30 0x9C 0x60 0x85 0x72 0x70 0x86 0x80 0x84 0x7A 0xEF 0x2B"
		fingerprint deviceId: "0x2001", inClusters: "0x30, 0x60, 0x70, 0x72, 0x80, 0x84, 0x85, 0x9C"  // should include "0x20, 0x31" too ?!!
	}
	preferences {
   		input name:"wakeUpInterval", type:"number", title: "<b>Wake-up Interval?</b>", description:"seconds (default: 3600)", defaultValue:3600, range: "0..65535", required: true   //Actual min max???
        
   		input name:"param1", type:"number",  title: "<b>Param. 1 - Input IN alarm cancellation delay?</b>", description:"seconds (default: 0)", defaultValue:0, range: "0..65535", required: true
   		input "param2", "enum",              title: "<b>Param. 2 - Status change signalled by LED?</b>", description:"(default: 0 - OFF)", options: [0:"OFF",1:"ON"], defaultValue:0, required: true
   		input "param3", "enum",              title: "<b>Param. 3 - Type of IN input?</b>", description:"(default: 0 – INPUT_NC)", options: [0:"INPUT_NC (Normal Close)", 1:"INPUT_NO (Normal Open)", 2:"INPUT_MONOSTABLE", 3:"INPUT_BISTABLE"], defaultValue:0, required: true
   		input "param5", "enum",              title: "<b>Param. 5 - Type of control frame transmitted for association group 1?</b>", description:"(Default value: 255 – BASIC SET)", options: [0:"ALARM GENERIC frame", 1:"ALARM SMOKE frame", 2:"ALARM CO frame",3:"ALARM CO2 frame",4:"ALARM HEAT frame",5:"ALARM WATER frame",255:"Control frame BASIC_SET"], defaultValue:255, required: true
   		input name:"param7",type:"number",   title: "<b>Param. 7 - forced level of dimming/opening ?</b>", description:"1-99 or 255 (default: 255 - activate to previous level)", defaultValue:255, range: "1..255", required: true   // need changes to limit values to valid range...
   		input "param9", "enum",              title: "<b>Param. 9 - Deactivating transmission of the alarm cancelling frame or the control frame deactivating the device?</b>", description:"(default: 0, Sent)", options: [0:"Sent",1:"Not Sent"], defaultValue:0, required: true
   		input name:"param12", type:"number", title: "<b>Param. 12 - Sensitivity to temperature changes?</b>", description:"In 1/16 degC units, If the value is set to 0 and wake-up interval is set to 255 seconds, temperature report will be sent according to the interval. If the value is set to 0 and the wake-up interval is set to over 255, temperature report will be sent each ca. 4 minutes (default: 8 [0.5degC])", defaultValue:8, range: "0..255", required: true
   		input "param13", "enum",             title: "<b>Param. 13 - Sending an alarm or control frame (for IN input, depending on parameter no.5 value), and TMP button alarm frame?</b>", description:"(default: 0, IN and TMP Broadcast mode inactive)", options: [0:"IN and TMP Broadcast mode inactive", 1:"IN broadcast mode active, TMP broadcast mode inactive", 2:"IN broadcast mode inactive, TMP broadcast mode active", 3:"IN and TMP broadcast mode active"], defaultValue:0, required: true         
   		input "param14", "enum",             title: "<b>Param. 14 - Scene activation functionality?</b>", description:"(default: 0 - functionality deactivated)", options: [0:"functionality deactivated", 1:"functionality activated"], defaultValue:0, required: true
        
		input name:"sensorOffset", type:"decimal", title:"<b>Sensor Temperature Offset</b>", description:"degrees", defaultValue:0.0, range: "-20..20", required: true
        input name: "debugOutput",   type: "bool", title: "<b>Enable debug logging?</b>",   description: "<br>", defaultValue: true , required: true        
		input "debugLevel", "enum", title: "<b>Debug Level?</b>", options: [1:"1",2:"2",3:"3"], defaultValue: 1, required: true
    }
}

//---------------------------
//
//---------------------------
def test() {
    parse("zw device: 14, command: 8407, payload: , isMulticast: false")
    parse("zw device: 16, command: 600D, payload: 02 02 31 05 01 44 00 00 0B 79 , isMulticast: false")
    parse("zw device: 16, command: 2001, payload: 00 , isMulticast: false")                             // Basic set
    parse("zw device: 16, command: 3003, payload: 00 , isMulticast: false")                               //SensorBinaryReport
    parse("zw device: 16, command: 2001, payload: FF , isMulticast: false")
    parse("zw device: 16, command: 3003, payload: FF , isMulticast: false")
    parse("zw device: 14, command: 7006, payload: 0F 01 00 , isMulticast: false")
    parse("zw device: 14, command: 9C02, payload: 14 00 FF 00 00 , isMulticast: false")
    parse("zw device: 14, command: 9C02, payload: 14 00 00 00 00 , isMulticast: false")
    parse("zw device: 16, command: 600D, payload: 02 02 31 05 01 44 00 00 05 79 , isMulticast: false")    
}


//---------------------------
//
//---------------------------
def parse(String description) {
		state.parseCount=state.parseCount+1
		logDebug 1, "--------------------------Parsing... ; state.parseCount: ${state.parseCount}--------------------------"
    
		logDebug 2, "Parsing... '${description}'"
        def result = null
        def cmd = zwave.parse(description, [0x20:1, 0x30:1, 0x31:2, 0x56:1, 0x60:3, 0x70:2, 0x72:2, 0x80:1, 0x84:2, 0x85:2, 0x9C:1])
        if (cmd) {
                result = zwaveEvent(cmd)
                logDebug 1, "Parsed ${cmd} to ${result.inspect()}"
        } else {
                logDebug 3, "Non-parsed event: ${description}"
        }
        return result
}


//---------------------------
//
//---------------------------
def temperatureScaleFC(tempvalue) {
	//FGK-101 is natively °C; convert to °F if selected in settings
	def float tempFC = tempvalue
	if (location.temperatureScale == "F") {
		tempFC = tempvalue * 1.8 + 32
	}
	return tempFC
}

//---------------------------
//
//---------------------------
def wakeUpResponse(cmdBlock) {
	//Initialization... (executed only once, when the Handler has been updated)
    //All untouched parameters are supposed to be DEFAULT (as factory-set)
     if (state.isInitialized == false) {
    	logDebug 2, "state.isInitialized : ${state.isInitialized}"
        cmdBlock << zwave.wakeUpV2.wakeUpIntervalSet(seconds:wakeUpInterval, nodeid:zwaveHubNodeId).format() // NB : may have to wait 60mn for that value to be refreshed !
        cmdBlock << "delay 1200"
        // NOTE : any asynchronous temperature query thru SensorMultilevelGet() does NOT reset the delta-Temp base value (managed by DS18B20 hardware)
        // Adjust temperature report sensitivity for outside thermometers whose displayName starts with "*"
        cmdBlock << zwave.configurationV2.configurationSet(parameterNumber: 1, size: 2, configurationValue: (1..0).collect { (param1.toInteger() >> (it * 8)) & 0xFF}).format()
        cmdBlock << "delay 1200"     
        cmdBlock << zwave.configurationV2.configurationSet(parameterNumber: 2, size: 1, configurationValue: [param2.toInteger()]).format()
        cmdBlock << "delay 1200"     
        cmdBlock << zwave.configurationV2.configurationSet(parameterNumber: 3, size: 1, configurationValue: [param3.toInteger()]).format()
        cmdBlock << "delay 1200"     
        cmdBlock << zwave.configurationV2.configurationSet(parameterNumber: 5, size: 1, configurationValue: [param5.toInteger()]).format()
        cmdBlock << "delay 1200"     
        cmdBlock << zwave.configurationV2.configurationSet(parameterNumber: 7, size: 1, configurationValue: [param7.toInteger()]).format()
        cmdBlock << "delay 1200"     
        cmdBlock << zwave.configurationV2.configurationSet(parameterNumber: 9, size: 1, configurationValue: [param9.toInteger()]).format()
        cmdBlock << "delay 1200"     
        cmdBlock << zwave.configurationV2.configurationSet(parameterNumber: 12, size: 1, configurationValue: [param12.toInteger()]).format()
        cmdBlock << "delay 1200"     
        cmdBlock << zwave.configurationV2.configurationSet(parameterNumber: 13, size: 1, configurationValue: [param13.toInteger()]).format()
        cmdBlock << "delay 1200"     
        cmdBlock << zwave.configurationV2.configurationSet(parameterNumber: 14, size: 1, configurationValue: [param14.toInteger()]).format()
        cmdBlock << "delay 1200"     
        // inclusion of Device in Association#3 is needed to get delta-Temperature notification messages [cf Parameter#12 above]
        cmdBlock << zwave.associationV2.associationSet(groupingIdentifier:3, nodeId:[zwaveHubNodeId]).format()
        cmdBlock << "delay 1200"
        // inclusion of Device in Association#2 is needed to enable SensorAlarmReport() Command [anti-Tampering protection]
        cmdBlock << zwave.associationV2.associationSet(groupingIdentifier:2, nodeId:[zwaveHubNodeId]).format()
        cmdBlock << "delay 1200"
        // inclusion of Device in Association#4 is needed for backward compatibility with non Z-Wave+ controlers
        cmdBlock << zwave.associationV2.associationSet(groupingIdentifier:4, nodeId:[zwaveHubNodeId]).format()
        cmdBlock << "delay 1200"
        // inclusion of Device in Association#5 is needed for backward compatibility with non Z-Wave+ controlers
        cmdBlock << zwave.associationV2.associationSet(groupingIdentifier:5, nodeId:[zwaveHubNodeId]).format()
        cmdBlock << "delay 1200"
        // Firmware Version
        cmdBlock << zwave.versionV1.versionGet().format()
        cmdBlock << "delay 1200"
        state.isInitialized = true
        logDebug 2, "state.isInitialized : ${state.isInitialized}"
    }
    
	//Regular Commands...
    def long nowTime = new Date().getTime()
    // Next line needed because "update()" does not seem to work anymore
    state.batteryInterval = (long) (24*60-45)*60*1000  // 1 day
    if (nowTime-state.lastReportBattery > state.batteryInterval) {
		cmdBlock << zwave.batteryV1.batteryGet().format()
        cmdBlock << "delay 1200"
        //next 2 lines redondant since any open/closed status change is asynchronously notified... but useful in case of missing basicSet notification
    	cmdBlock << zwave.basicV1.basicGet().format()
    	cmdBlock << "delay 1200"
    }

    cmdBlock << zwave.wakeUpV2.wakeUpIntervalGet().format() // NB : may have to wait 60mn for that value to be refreshed !
    cmdBlock << "delay 1200"
    cmdBlock << zwave.multiChannelV3.multiChannelCmdEncap(sourceEndPoint: 2, destinationEndPoint: 2, commandClass:0x31/*Sensor Multilevel*/, command:4/*Get*/).format()
    cmdBlock << "delay 1200"
    cmdBlock << zwave.wakeUpV2.wakeUpNoMoreInformation().format()
    cmdBlock << "delay 2000"
    
    logDebug 2, "wakeUpNoMoreInformation()"
    logDebug 2, "cmdBlock : ${cmdBlock}"
    
    return cmdBlock
}

//---------------------------
//
//---------------------------
def zwaveEvent(hubitat.zwave.commands.wakeupv2.WakeUpNotification cmd) {
		// IMPORTANT NOTE : when the batteryLevel becomes too low, Device reports become erratic, all periodic wakeUpNotifications stop
        // and consequently BATTERYLEVEL IS NOT UPDATED ANYMORE every 24 hours, continuing to display the last (and obsolete) reported value.
        // Curiously, asynchronous sensorMultilevelReports continue to arrive, for some time, making the Device look (partially) "alive"
    	logDebug 2, "wakeupv2.WakeUpNotification $cmd"
        def event = sendEvent(descriptionText: "${device.displayName} woke up", isStateChange: true, displayed: false)
        def cmdBlock = []
        cmdBlock=wakeUpResponse(cmdBlock)
        return [event, response(cmdBlock)]
}

//---------------------------
//
//---------------------------
def zwaveEvent(hubitat.zwave.commands.sensormultilevelv2.SensorMultilevelReport cmd) {
	// IMPORTANT NOTE : when the batteryLevel becomes too low, Device reports become erratic, all periodic wakeUpNotifications stop
	// and consequently BATTERYLEVEL IS NOT UPDATED ANYMORE every 24 hours, continuing to display the last (and obsolete) reported value.
	// Curiously, asynchronous sensorMultilevelReports continue to arrive, for some time, making the Device look (partially) "alive"
	// This section resets the displayed battery level to 1% when the battery level is obsolete by more than 48h.
    state.batteryInterval = (long) (24*60-45)*60*1000  // 1 day
    def long nowTime = new Date().getTime()
    if (nowTime-state.lastReportBattery > 3*state.batteryInterval) {  // reset batteryLevel to 1% if no update for 48-72 hours
    	logDebug 3, "obsolete (likely low) battery value : ${((nowTime-state.lastReportBattery)/3600000)} hours old"
        sendEvent(name: "battery", displayed: true, isStateChange:true, unit: "%", value: 1, descriptionText: "${device.displayName} has a low battery")
	    state.lastReportBattery = nowTime
	}
			//  Dirty temporary recovery fix for remote Devices which lost wakeUp capability but still get asynchromous SensorMultilevelReports
			//  Forcing with the magnet a close/open transition after replacing the battery should (in most cases...) restore wakeUps
                //def cmdBlock = []
        		//cmdBlock=wakeUpResponse(cmdBlock)
        		//return [response(cmdBlock)]
        		//configure()
        def float scaledSensorValue = cmd.scaledSensorValue
    
        scaledSensorValue = scaledSensorValue + 1.0*sensorOffset 
    
        //Round to nearest 1 decimal temperature value; convert to °F if needed
        def float ftempSign = temperatureScaleFC(scaledSensorValue) < 0 ? -1 : +1
		def float ftemp = ftempSign * ((((temperatureScaleFC(scaledSensorValue).abs()*100+5)/10).intValue()*1.0)/10)
        	logDebug 2, "ftempSign : ${ftempSign}"
        	logDebug 2, "ftemp : ${ftemp}"

    // Next line needed because "update()" does not seem to work anymore
    	state.maxEventInterval = (long) (4*60-10)*60*1000  // at least 1 Temperature Report event every 4 hours
        nowTime = new Date().getTime()
       	logDebug 2, "cmd.scaledSensorValue : ${cmd.scaledSensorValue}"
       	logDebug 2, "correction : ${scaledSensorValue-cmd.scaledSensorValue}"
   		logDebug 2, "device.displayName : ${device.displayName}"
   		logDebug 2, "'Date().getTime()' : ${new Date().getTime()}"
        logDebug 2, "state.forcedWakeUp : ${state.forcedWakeUp}"
        logDebug 2, "state.maxEventInterval : ${state.maxEventInterval}"
   		logDebug 2, "state.lastReportTime : ${state.lastReportTime}"
   		logDebug 2, "nowTime : ${nowTime}"
   		logDebug 2, "(nowTime-state.lastReportTime > state.maxEventInterval) : ${(nowTime-state.lastReportTime > state.maxEventInterval)}"
   		logDebug 2, "ftemp : ${ftemp}"
        logDebug 2, "state.lastReportedTemp: ${state.lastReportedTemp}"

        def float tempQuantum
        tempQuantum = temperatureScaleFC(param12.toFloat()/16.0)-temperatureScaleFC(0)
        logDebug 1, "((ftemp-state.lastReportedTemp).abs()>${tempQuantum}): ${(ftemp-state.lastReportedTemp).abs()>tempQuantum}"
        if (((ftemp-state.lastReportedTemp).abs()>tempQuantum) || ((nowTime-state.lastReportTime) > state.maxEventInterval) || state.forcedWakeUp) {
        	def map = [ displayed: true, value: ftemp.toString(), isStateChange:true, linkText:"${device.displayName}" ]
        	switch (cmd.sensorType) {
                case 1:
                        map.name = "temperature"
                        map.unit = cmd.scale == 1 ? "F" : "C"
                        //ignores Device's native temperature scale, ftemp already converted to °F if settings as such
                        map.unit = location.temperatureScale
                        logDebug 1, "map.value : ${map.value}"
                        logDebug 1, "map.unit : ${map.unit}"
                        break;
        	}
            logDebug 2, "temperature Command : ${map.inspect()}"
        	
        	state.lastReportedTemp = ftemp
            state.lastReportTime = nowTime
            state.forcedWakeUp = false
            // For Test purpose; redondant with reportNext() => state.forcedWakeUp=1
            if (device.currentValue('reportASAP')==1) {sendEvent(name: "reportASAP", value: 0, isStateChange: true)}
        	return sendEvent(map)
        }
}

//---------------------------
//
//---------------------------
def sensorValueEvent(value) {
	if (value) {
		sendEvent(name: "contact", value: "open", descriptionText: "$device.displayName is open")
	} else {
		sendEvent(name: "contact", value: "closed", descriptionText: "$device.displayName is closed")
	}
}

//---------------------------
// BasicReport should not be necessary since all status change notifications are asynchronous via BasicSet
// But useful as defensive programming, in case of missed notifications, to make sure latest change has been properly reported and registered
//---------------------------
def zwaveEvent(hubitat.zwave.commands.basicv1.BasicReport cmd) {
	sensorValueEvent(cmd.value)
    logDebug 2, "basicv1.BasicReport $cmd.value"
    def cmdValue = cmd.value
	return openClosed(cmd, cmdValue)
}

//---------------------------
// To check that WakeUpInterval does not revert to 1mn instead of 1h
//---------------------------

def zwaveEvent(hubitat.zwave.commands.wakeupv2.WakeUpIntervalReport cmd) {
    logDebug 2, "WakeUpIntervalReport $cmd"
    if (cmd.seconds!=wakeUpInterval) {
    	def result = sendEvent(name:"WakeUpIntervalReport", value:"${cmd.seconds}", descriptionText:"${device.displayName} had ${cmd.seconds} seconds wakeUp period", isStateChange:true, displayed:true, linkText:"${device.displayName}")
   		configure()
    }
    return result
}

//---------------------------
//
//---------------------------
def openClosed(cmd, cmdValue) {
    def theState = cmdValue == 0 ? "closed" : "open"
    logDebug 2, "openClosed $cmd"
    // Use closed/open sensor notification to trigger push of updated Temperature value and immediate setting of updated device parameters
    // Sometimes, Temperature forced refresh stops working : SensorMultilevelGet() Commands are stacked but not executed immediately;
    // will restart after some time, and stacked Commands will be executed !
    def event = sendEvent(name:"contact", value:"${theState}", descriptionText:"${device.displayName} is ${theState}", isStateChange:true, displayed:true, linkText:"${device.displayName}")
    state.forcedWakeUp = true
    def cmdBlock = []
    cmdBlock=wakeUpResponse(cmdBlock)
    return [event, response(cmdBlock)]
}
    
//---------------------------
//
//---------------------------
def zwaveEvent(hubitat.zwave.commands.basicv1.BasicSet cmd) {
    logDebug 2, "basicv1.BasicSet $cmd"
    def cmdValue = cmd.value
	return openClosed(cmd, cmdValue)
}

//---------------------------
// SensorBinaryReport should never occur since all status change notifications are asynchronous via BasicSet
//---------------------------
def zwaveEvent(hubitat.zwave.commands.sensorbinaryv1.SensorBinaryReport cmd) {
    logDebug 2, "sensorbinaryv1.SensorBinaryReport $cmd"
    def cmdValue = cmd.sensorValue
	return openClosed(cmd, cmdValue)
}

//---------------------------
//
//---------------------------
def zwaveEvent(hubitat.zwave.commands.sensoralarmv1.SensorAlarmReport cmd) {
	//def event = sensorValueEvent(cmd.sensorState)
    logDebug 2, "sensoralarmv1.SensorAlarmReport $cmd.sensorState"
    def event = sendEvent(name:"alarm", value:"$cmd.sensorState", descriptionText:"${device.displayName} is tampered with !", isStateChange:true, displayed:true, linkText:"${device.displayName}")
    def cmdBlock = []
    state.forcedWakeUp = true
    cmdBlock=wakeUpResponse(cmdBlock)
    return [event, response(cmdBlock)]
}


//---------------------------
//
//---------------------------
def zwaveEvent(hubitat.zwave.commands.batteryv1.BatteryReport cmd) {
    // Next line needed because "update()" does not seem to work anymore
    state.batteryInterval = (long) (24*60-45)*60*1000  // 1 day
    def long nowTime = new Date().getTime()
   	logDebug 2, "batteryv1.BatteryReport ${cmd.batteryLevel}"
   	logDebug 2, "nowTime : ${nowTime}"
   	logDebug 2, "state.lastReportBattery : ${state.lastReportBattery}"
   	logDebug 2, "state.batteryInterval : ${state.batteryInterval}"
    logDebug 2, "state.forcedWakeUp : ${state.forcedWakeUp}"

    if ((nowTime-state.lastReportBattery > state.batteryInterval) || state.forcedWakeUp) {
		def map = [ name: "battery", displayed: true, isStateChange:true, unit: "%" ]
		if (cmd.batteryLevel == 0xFF) {
			map.value = 1
			map.descriptionText = "${device.displayName} has a low battery"
			map.isStateChange = true
		} else {
			map.value = cmd.batteryLevel
		}
    	state.lastReportBattery = nowTime
        logDebug 1, "battery map : ${map}"
    	return [sendEvent(map)]
    }
}

//---------------------------
//
//---------------------------
def zwaveEvent(hubitat.zwave.commands.configurationv2.ConfigurationReport cmd) {
    logDebug 2, "ConfigurationReport - Parameter#${cmd.parameterNumber}: ${cmd.configurationValue}"
}

//---------------------------
//
//---------------------------
def zwaveEvent(hubitat.zwave.commands.multichannelv3.MultiChannelEndPointReport cmd) {
    logDebug 2, "multichannelv3.MultiChannelCapabilityReport: ${cmd}"
}

//---------------------------
//
//---------------------------
def zwaveEvent(hubitat.zwave.commands.multichannelv3.MultiChannelCapabilityReport cmd) {
    logDebug 2, "multichannelv3.MultiChannelCapabilityReport: ${cmd}"
}
 
//---------------------------
//
//---------------------------
def zwaveEvent(hubitat.zwave.commands.versionv1.VersionReport cmd) {
    logDebug 2, "versionv1.VersionReport: ${cmd}"
	BigDecimal fw = cmd.firmware0Version //applicationVersion
	fw = fw + cmd.firmware0SubVersion/10 // applicationSubVersion / 100
    
	state.firmware = fw
}


//---------------------------
// MultiChannelCmdEncap and MultiInstanceCmdEncap are ways that devices can indicate that a message
// is coming from one of multiple subdevices or "endpoints" that would otherwise be indistinguishable
//---------------------------
def zwaveEvent(hubitat.zwave.commands.multichannelv3.MultiChannelCmdEncap cmd) {
        def encapsulatedCommand = cmd.encapsulatedCommand([0x30: 1, 0x31: 2]) // can specify command class versions here like in zwave.parse
        logDebug 2, ("Command from endpoint ${cmd.sourceEndPoint}: ${encapsulatedCommand}")
        if (encapsulatedCommand) {
                return zwaveEvent(encapsulatedCommand)
        }
}

//---------------------------
//
//---------------------------
// Catch All command Handler in case of unexpected message
def zwaveEvent(hubitat.zwave.Command cmd) {
	sendEvent(descriptionText: "!!! $device.displayName: ${cmd}", displayed: false)
}

//---------------------------
// When a Temperature Event got lost in transit, the Watchdog requests a forced report at next wake up
// The "reportNext()" alarm command is used to signal back from the Watchdog SmartApp to the sleepy Device Handler
//---------------------------
def reportNext(commandMsg) {
	logDebug 3, "reportNext !"
    logDebug 3, "commandMsg : ${commandMsg}"
    state.forcedWakeUp = true
		// IMPORTANT NOTE : when the batteryLevel becomes too low, Device reports become erratic, all periodic wakeUpNotifications stop
        // and consequently BATTERYLEVEL IS NOT UPDATED ANYMORE every 24 hours, continuing to display the last (and obsolete) reported value.
        // Curiously, asynchronous sensorMultilevelReports continue to arrive, for some time, making the Device look (partially) "alive"
    	// This section resets the displayed battery level to 1% when the battery level is obsolete by more than 48h.
	// Next line may be needed because "update()" does not seem to work reliably anymore
    state.batteryInterval = (long) (24*60-45)*60*1000  // 1 day
    def long nowTime = new Date().getTime()
    if (nowTime-state.lastReportBattery > 3*state.batteryInterval) {  // reset batteryLevel to 1% if no update for 48-72 hours
    	logDebug 3, "obsolete (likely low) battery value : ${((nowTime-state.lastReportBattery)/3600000)} hours old"
        sendEvent(name: "battery", displayed: true, isStateChange:true, unit: "%", value: 1, descriptionText: "${device.displayName} has a low battery")
	    state.lastReportBattery = nowTime
	}
	return []
}

///////////////////
// For Tests Purpose
///////////////////

//---------------------------
// Executed each time the Handler is updated
//---------------------------
def updated() {
	logDebug 1, "Updated !"
    
    logDebug 1, "param1 = $param1"
    logDebug 1, "param2 = $param2"
    logDebug 1, "param3 = $param3"
    logDebug 1, "param5 = $param5"
    logDebug 1, "param7 = $param7"
    logDebug 1, "param9 = $param9"
    logDebug 1, "param12 = $param12"
    logDebug 1, "param13 = $param13"
    logDebug 1, "param14 = $param14"
    
    
    // All state.xxx attributes are Device-local, NOT Location-wide
    state.isInitialized = false
    state.lastReportedTemp = (float) -1000
    state.lastReportTime = (long) 0
    state.lastReportBattery = (long) 0
	// Real-time clock of sensors (ceramic resonator) is up to 3% inaccurate
    state.batteryInterval = (long) (24*60-45)*60*1000  // 1 Battery Report event every 24 hours, rounded up to the nearest hourly wakeup
    state.maxEventInterval = (long) (4*60-10)*60*1000  // at least 1 Temperature Report event every 3:50 hours
    state.parseCount=(int) 0
    state.forcedWakeUp = true
    if (!(state.deviceID)) {state.deviceID = device.name}
    logDebug 1, "state.deviceID: ${state.deviceID}"
    logDebug 1, "state.batteryInterval : ${state.batteryInterval}"
    logDebug 1, "state.maxEventInterval : ${state.maxEventInterval}"
    // For Test purpose; redondant with reportNext() => state.forcedWakeUp=1
    sendEvent(name: "reportASAP", value: 1, isStateChange: true)
    logDebug 1, "device.currentValue('reportASAP') : ${device.currentValue('reportASAP')}"

    infos()
}

//---------------------------
//
//---------------------------
def installed()
{
	logDebug 1, "installed"
	state.driverVersion = "${version()}"
}

//---------------------------
// If you add the Configuration capability to your device type, this command will be called right
// after the device joins to set device-specific configuration commands.
//---------------------------
def configure() {
	logDebug 1, "Configuring..."
    logDebug 1, "device.displayName.substring(0,1) : ${device.displayName.substring(0,1)}"
	delayBetween([
		// Make sure sleepy battery-powered sensors send their WakeUpNotifications to the hub
		zwave.wakeUpV2.wakeUpIntervalSet(seconds:wakeUpInterval, nodeid:zwaveHubNodeId).format(),
		// NOTE : any asynchronous temperature query thru SensorMultilevelGet() does NOT reset the delta-Temp base value (managed by DS18B20 hardware)
        zwave.configurationV2.configurationSet(parameterNumber: 1, size: 2, configurationValue: (1..0).collect { (param1.toInteger() >> (it * 8)) & 0xFF}).format(),
        zwave.configurationV2.configurationSet(parameterNumber: 2, size: 1, configurationValue: [param2.toInteger()]).format(),
        zwave.configurationV2.configurationSet(parameterNumber: 3, size: 1, configurationValue: [param3.toInteger()]).format(),
        zwave.configurationV2.configurationSet(parameterNumber: 5, size: 1, configurationValue: [param5.toInteger()]).format(),
        zwave.configurationV2.configurationSet(parameterNumber: 7, size: 1, configurationValue: [param7.toInteger()]).format(),
        zwave.configurationV2.configurationSet(parameterNumber: 9, size: 1, configurationValue: [param9.toInteger()]).format(),
        zwave.configurationV2.configurationSet(parameterNumber: 12, size: 1, configurationValue: [param12.toInteger()]).format(),
        zwave.configurationV2.configurationSet(parameterNumber: 13, size: 1, configurationValue: [param13.toInteger()]).format(),
        zwave.configurationV2.configurationSet(parameterNumber: 14, size: 1, configurationValue: [param14.toInteger()]).format(),
        
        // inclusion of Device in Association#3 is needed to get delta-Temperature notification messages [cf Parameter#12 above]
        zwave.associationV2.associationSet(groupingIdentifier:3, nodeId:[zwaveHubNodeId]).format(),
        // inclusion of Device in Association#2 is needed to enable SensorAlarmReport() Command [anti-Tampering protection]
        zwave.associationV2.associationSet(groupingIdentifier:2, nodeId:[zwaveHubNodeId]).format(),
        // get zwave version information
        zwave.versionV1.versionGet().format()
	],1200)
}

//---------------------------
//
//---------------------------
def infos() {
	if (!state.devices) { state.devices = [:] }
    logDebug 1, "zwaveHubNodeId: ${zwaveHubNodeId}"					// -> "1"
    logDebug 1, "device.displayName: ${device.displayName}"			// -> "JJG"
    logDebug 1, "device.id: ${device.id}"							// -> "75841488-ae76-4cac-b523-a2694e72c25a"
    logDebug 1, "device.name: ${device.name}"						// -> "T001"
    logDebug 1, "device.label: ${device.label}"						// -> "JJG"
    logDebug 1, "device.data: ${device.data}"   					// -> "[endpointId:0, version: 2.1, MSR:010F-0700-2000]"
    //logDebug 1, "'device.rawDescription': ${device.rawDescription}"	// -> "0 0 0x2001 0 0 0 c 0x30 0x9C 0x60 0x85 0x72 0x70 0x86 0x80 0x84 0x7A 0xEF 0x2B"
}

//---------------------------
//
//---------------------------
private logDebug(level, msg) {
	if ((level>=debugLevel.toInteger()) && (settings?.debugOutput || settings?.debugOutput == null)) {
		log.debug "$msg"
	}
}
1 Like

I'll test it out and let you know.

Saving defaults and clicking "Configure", it looks like nothing happened, no logs. I tried the three sensors waking them up and clicking "Configure" within 1-2 seconds.

I restarted the hub, powered on/off the sensors and then saved the previous version, so we're back in business.

You may want to start including a version number in the driver so we can reference them correctly :slight_smile: I just added a date to the description.

With the changes I made it is probably better to start from scratch (adding a device) and then "save preferences", You can then manually wake-up the device and it should automatically get configured at that time. Configure is not really part of the process for this driver.

Already there, see my previous post.

1 Like

Ok, will try that tomorrow with one of the sensors. Perhaps @jean.vancaloen , you can give it a go as well?

1 Like

Ok, reset one of the sensors and exclude/include etc. Here are the logs (had to remove some of the beginning due to post/character limit)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:02.061 am [debug](http://192.168.0.50/device/edit/387)Parsed MultiChannelCmdEncap(bitAddress:false, command:5, commandClass:49, destinationEndPoint:2, parameter:[1, 68, 0, 0, 17, 16], res01:false, sourceEndPoint:2) to null

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:02.058 am [debug](http://192.168.0.50/device/edit/387)temperature Command : ['displayed':true, 'value':'110.6', 'isStateChange':true, 'linkText':One, 'name':'temperature', 'unit':'F']

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:02.056 am [debug](http://192.168.0.50/device/edit/387)map.unit : F

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:02.055 am [debug](http://192.168.0.50/device/edit/387)map.value : 110.6

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:02.054 am [debug](http://192.168.0.50/device/edit/387)((ftemp-state.lastReportedTemp).abs()>0.5625): true

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:02.051 am [debug](http://192.168.0.50/device/edit/387)state.lastReportedTemp: 112.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:02.050 am [debug](http://192.168.0.50/device/edit/387)ftemp : 110.6

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:02.049 am [debug](http://192.168.0.50/device/edit/387)(nowTime-state.lastReportTime > state.maxEventInterval) : false

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:02.048 am [debug](http://192.168.0.50/device/edit/387)nowTime : 1663852562040

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:02.047 am [debug](http://192.168.0.50/device/edit/387)state.lastReportTime : 1663852500873

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:02.046 am [debug](http://192.168.0.50/device/edit/387)state.maxEventInterval : 13800000

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:02.045 am [debug](http://192.168.0.50/device/edit/387)state.forcedWakeUp : false

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:02.044 am [debug](http://192.168.0.50/device/edit/387)'Date().getTime()' : 1663852562043

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:02.043 am [debug](http://192.168.0.50/device/edit/387)device.displayName : One

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:02.042 am [debug](http://192.168.0.50/device/edit/387)correction : 3.051757815342171E-7

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:02.040 am [debug](http://192.168.0.50/device/edit/387)cmd.scaledSensorValue : 43.68

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:02.039 am [debug](http://192.168.0.50/device/edit/387)ftemp : 110.6

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:02.038 am [debug](http://192.168.0.50/device/edit/387)ftempSign : 1.0

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:02.035 am [debug](http://192.168.0.50/device/edit/387)Command from endpoint 2: SensorMultilevelReport(precision:2, scale:0, sensorType:1, sensorValue:[0, 0, 17, 16], size:4, scaledSensorValue:43.68)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:02.031 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 600D, payload: 02 02 31 05 01 44 00 00 11 10 , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:02.030 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 58--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:00.833 am [debug](http://192.168.0.50/device/edit/387)Parsed WakeUpIntervalReport(nodeid:1, seconds:60) to null

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:00.831 am [debug](http://192.168.0.50/device/edit/387)WakeUpIntervalReport WakeUpIntervalReport(nodeid:1, seconds:60)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:00.828 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 8406, payload: 00 00 3C 01 , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:00.827 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 57--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:00.782 am [debug](http://192.168.0.50/device/edit/387)Parsed WakeUpNotification() to [null, hubitat.device.HubMultiAction@9be12e]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:00.779 am [debug](http://192.168.0.50/device/edit/387)cmdBlock : [8405, delay 1200, 600D02023104, delay 1200, 8408, delay 2000]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:00.778 am [debug](http://192.168.0.50/device/edit/387)wakeUpNoMoreInformation()

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:00.775 am [debug](http://192.168.0.50/device/edit/387)wakeupv2.WakeUpNotification WakeUpNotification()

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:00.773 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 8407, payload: , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:16:00.772 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 56--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:15:00.894 am [debug](http://192.168.0.50/device/edit/387)Parsed MultiChannelCmdEncap(bitAddress:false, command:5, commandClass:49, destinationEndPoint:2, parameter:[1, 68, 0, 0, 17, 141], res01:false, sourceEndPoint:2) to null

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:15:00.891 am [debug](http://192.168.0.50/device/edit/387)temperature Command : ['displayed':true, 'value':'112.9', 'isStateChange':true, 'linkText':One, 'name':'temperature', 'unit':'F']

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:15:00.889 am [debug](http://192.168.0.50/device/edit/387)map.unit : F

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:15:00.888 am [debug](http://192.168.0.50/device/edit/387)map.value : 112.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:15:00.886 am [debug](http://192.168.0.50/device/edit/387)((ftemp-state.lastReportedTemp).abs()>0.5625): true

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:15:00.884 am [debug](http://192.168.0.50/device/edit/387)state.lastReportedTemp: 68.8

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:15:00.883 am [debug](http://192.168.0.50/device/edit/387)ftemp : 112.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:15:00.882 am [debug](http://192.168.0.50/device/edit/387)(nowTime-state.lastReportTime > state.maxEventInterval) : false

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:15:00.881 am [debug](http://192.168.0.50/device/edit/387)nowTime : 1663852500873

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:15:00.880 am [debug](http://192.168.0.50/device/edit/387)state.lastReportTime : 1663852377728

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:15:00.879 am [debug](http://192.168.0.50/device/edit/387)state.maxEventInterval : 13800000

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:15:00.878 am [debug](http://192.168.0.50/device/edit/387)state.forcedWakeUp : false

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:15:00.877 am [debug](http://192.168.0.50/device/edit/387)'Date().getTime()' : 1663852500876

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:15:00.876 am [debug](http://192.168.0.50/device/edit/387)device.displayName : One

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:15:00.875 am [debug](http://192.168.0.50/device/edit/387)correction : 3.051757815342171E-7

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:15:00.873 am [debug](http://192.168.0.50/device/edit/387)cmd.scaledSensorValue : 44.93

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:15:00.872 am [debug](http://192.168.0.50/device/edit/387)ftemp : 112.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:15:00.871 am [debug](http://192.168.0.50/device/edit/387)ftempSign : 1.0

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:15:00.869 am [debug](http://192.168.0.50/device/edit/387)Command from endpoint 2: SensorMultilevelReport(precision:2, scale:0, sensorType:1, sensorValue:[0, 0, 17, 141], size:4, scaledSensorValue:44.93)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:15:00.864 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 600D, payload: 02 02 31 05 01 44 00 00 11 8D , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:15:00.863 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 55--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:14:59.786 am [debug](http://192.168.0.50/device/edit/387)Parsed WakeUpIntervalReport(nodeid:1, seconds:60) to null

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:14:59.784 am [debug](http://192.168.0.50/device/edit/387)WakeUpIntervalReport WakeUpIntervalReport(nodeid:1, seconds:60)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:14:59.779 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 8406, payload: 00 00 3C 01 , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:14:59.778 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 54--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:14:59.614 am [debug](http://192.168.0.50/device/edit/387)Parsed WakeUpNotification() to [null, hubitat.device.HubMultiAction@186f17d]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:14:59.611 am [debug](http://192.168.0.50/device/edit/387)cmdBlock : [8405, delay 1200, 600D02023104, delay 1200, 8408, delay 2000]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:14:59.610 am [debug](http://192.168.0.50/device/edit/387)wakeUpNoMoreInformation()

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:14:59.607 am [debug](http://192.168.0.50/device/edit/387)wakeupv2.WakeUpNotification WakeUpNotification()

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:14:59.605 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 8407, payload: , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:14:59.604 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 53--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:59.313 am [debug](http://192.168.0.50/device/edit/387)Parsed MultiChannelCmdEncap(bitAddress:false, command:5, commandClass:49, destinationEndPoint:2, parameter:[1, 68, 0, 0, 7, 251], res01:false, sourceEndPoint:2) to null

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:59.312 am [debug](http://192.168.0.50/device/edit/387)((ftemp-state.lastReportedTemp).abs()>0.5625): false

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:59.310 am [debug](http://192.168.0.50/device/edit/387)state.lastReportedTemp: 68.8

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:59.309 am [debug](http://192.168.0.50/device/edit/387)ftemp : 68.8

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:59.308 am [debug](http://192.168.0.50/device/edit/387)(nowTime-state.lastReportTime > state.maxEventInterval) : false

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:59.307 am [debug](http://192.168.0.50/device/edit/387)nowTime : 1663852439299

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:59.306 am [debug](http://192.168.0.50/device/edit/387)state.lastReportTime : 1663852377728

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:59.305 am [debug](http://192.168.0.50/device/edit/387)state.maxEventInterval : 13800000

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:59.304 am [debug](http://192.168.0.50/device/edit/387)state.forcedWakeUp : false

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:59.303 am [debug](http://192.168.0.50/device/edit/387)'Date().getTime()' : 1663852439302

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:59.301 am [debug](http://192.168.0.50/device/edit/387)device.displayName : One

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:59.300 am [debug](http://192.168.0.50/device/edit/387)correction : 3.051757815342171E-7

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:59.299 am [debug](http://192.168.0.50/device/edit/387)cmd.scaledSensorValue : 20.43

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:59.298 am [debug](http://192.168.0.50/device/edit/387)ftemp : 68.8

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:59.297 am [debug](http://192.168.0.50/device/edit/387)ftempSign : 1.0

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:59.294 am [debug](http://192.168.0.50/device/edit/387)Command from endpoint 2: SensorMultilevelReport(precision:2, scale:0, sensorType:1, sensorValue:[0, 0, 7, 251], size:4, scaledSensorValue:20.43)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:59.290 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 600D, payload: 02 02 31 05 01 44 00 00 07 FB , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:59.289 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 52--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:58.075 am [debug](http://192.168.0.50/device/edit/387)Parsed WakeUpIntervalReport(nodeid:1, seconds:60) to null

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:58.073 am [debug](http://192.168.0.50/device/edit/387)WakeUpIntervalReport WakeUpIntervalReport(nodeid:1, seconds:60)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:58.071 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 8406, payload: 00 00 3C 01 , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:58.069 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 51--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:58.026 am [debug](http://192.168.0.50/device/edit/387)Parsed WakeUpNotification() to [null, hubitat.device.HubMultiAction@2b90a1]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:58.023 am [debug](http://192.168.0.50/device/edit/387)cmdBlock : [8405, delay 1200, 600D02023104, delay 1200, 8408, delay 2000]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:58.022 am [debug](http://192.168.0.50/device/edit/387)wakeUpNoMoreInformation()

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:58.020 am [debug](http://192.168.0.50/device/edit/387)wakeupv2.WakeUpNotification WakeUpNotification()

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:58.017 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 8407, payload: , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:13:58.016 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 50--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:57.748 am [debug](http://192.168.0.50/device/edit/387)Parsed MultiChannelCmdEncap(bitAddress:false, command:5, commandClass:49, destinationEndPoint:2, parameter:[1, 68, 0, 0, 7, 251], res01:false, sourceEndPoint:2) to null

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:57.746 am [debug](http://192.168.0.50/device/edit/387)temperature Command : ['displayed':true, 'value':'68.8', 'isStateChange':true, 'linkText':One, 'name':'temperature', 'unit':'F']

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:57.744 am [debug](http://192.168.0.50/device/edit/387)map.unit : F

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:57.743 am [debug](http://192.168.0.50/device/edit/387)map.value : 68.8

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:57.741 am [debug](http://192.168.0.50/device/edit/387)((ftemp-state.lastReportedTemp).abs()>0.5625): true

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:57.740 am [debug](http://192.168.0.50/device/edit/387)state.lastReportedTemp: 67.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:57.739 am [debug](http://192.168.0.50/device/edit/387)ftemp : 68.8

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:57.737 am [debug](http://192.168.0.50/device/edit/387)(nowTime-state.lastReportTime > state.maxEventInterval) : false

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:57.736 am [debug](http://192.168.0.50/device/edit/387)nowTime : 1663852377728

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:57.735 am [debug](http://192.168.0.50/device/edit/387)state.lastReportTime : 1663852318664

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:57.734 am [debug](http://192.168.0.50/device/edit/387)state.maxEventInterval : 13800000

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:57.733 am [debug](http://192.168.0.50/device/edit/387)state.forcedWakeUp : false

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:57.732 am [debug](http://192.168.0.50/device/edit/387)'Date().getTime()' : 1663852377732

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:57.731 am [debug](http://192.168.0.50/device/edit/387)device.displayName : One

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:57.730 am [debug](http://192.168.0.50/device/edit/387)correction : 3.051757815342171E-7

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:57.729 am [debug](http://192.168.0.50/device/edit/387)cmd.scaledSensorValue : 20.43

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:57.728 am [debug](http://192.168.0.50/device/edit/387)ftemp : 68.8

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:57.727 am [debug](http://192.168.0.50/device/edit/387)ftempSign : 1.0

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:57.724 am [debug](http://192.168.0.50/device/edit/387)Command from endpoint 2: SensorMultilevelReport(precision:2, scale:0, sensorType:1, sensorValue:[0, 0, 7, 251], size:4, scaledSensorValue:20.43)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:57.720 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 600D, payload: 02 02 31 05 01 44 00 00 07 FB , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:57.718 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 49--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:56.522 am [debug](http://192.168.0.50/device/edit/387)Parsed WakeUpIntervalReport(nodeid:1, seconds:60) to null

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:56.520 am [debug](http://192.168.0.50/device/edit/387)WakeUpIntervalReport WakeUpIntervalReport(nodeid:1, seconds:60)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:56.517 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 8406, payload: 00 00 3C 01 , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:56.516 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 48--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:56.472 am [debug](http://192.168.0.50/device/edit/387)Parsed WakeUpNotification() to [null, hubitat.device.HubMultiAction@8fa55a]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:56.469 am [debug](http://192.168.0.50/device/edit/387)cmdBlock : [8405, delay 1200, 600D02023104, delay 1200, 8408, delay 2000]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:56.468 am [debug](http://192.168.0.50/device/edit/387)wakeUpNoMoreInformation()

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:56.466 am [debug](http://192.168.0.50/device/edit/387)wakeupv2.WakeUpNotification WakeUpNotification()

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:56.464 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 8407, payload: , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:12:56.462 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 47--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:59.669 am [debug](http://192.168.0.50/device/edit/387)Parsed MultiChannelCmdEncap(bitAddress:false, command:5, commandClass:49, destinationEndPoint:2, parameter:[1, 68, 0, 0, 7, 201], res01:false, sourceEndPoint:2) to null

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:59.667 am [debug](http://192.168.0.50/device/edit/387)((ftemp-state.lastReportedTemp).abs()>0.5625): false

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:59.666 am [debug](http://192.168.0.50/device/edit/387)state.lastReportedTemp: 67.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:59.665 am [debug](http://192.168.0.50/device/edit/387)ftemp : 67.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:59.663 am [debug](http://192.168.0.50/device/edit/387)(nowTime-state.lastReportTime > state.maxEventInterval) : false

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:59.662 am [debug](http://192.168.0.50/device/edit/387)nowTime : 1663852319654

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:59.661 am [debug](http://192.168.0.50/device/edit/387)state.lastReportTime : 1663852318664

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:59.660 am [debug](http://192.168.0.50/device/edit/387)state.maxEventInterval : 13800000

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:59.659 am [debug](http://192.168.0.50/device/edit/387)state.forcedWakeUp : false

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:59.658 am [debug](http://192.168.0.50/device/edit/387)'Date().getTime()' : 1663852319658

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:59.657 am [debug](http://192.168.0.50/device/edit/387)device.displayName : One

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:59.656 am [debug](http://192.168.0.50/device/edit/387)correction : 3.051757815342171E-7

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:59.655 am [debug](http://192.168.0.50/device/edit/387)cmd.scaledSensorValue : 19.93

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:59.654 am [debug](http://192.168.0.50/device/edit/387)ftemp : 67.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:59.652 am [debug](http://192.168.0.50/device/edit/387)ftempSign : 1.0

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:59.650 am [debug](http://192.168.0.50/device/edit/387)Command from endpoint 2: SensorMultilevelReport(precision:2, scale:0, sensorType:1, sensorValue:[0, 0, 7, 201], size:4, scaledSensorValue:19.93)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:59.646 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 600D, payload: 02 02 31 05 01 44 00 00 07 C9 , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:59.644 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 46--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:59.076 am [debug](http://192.168.0.50/device/edit/387)Parsed WakeUpIntervalReport(nodeid:1, seconds:60) to null

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:59.074 am [debug](http://192.168.0.50/device/edit/387)WakeUpIntervalReport WakeUpIntervalReport(nodeid:1, seconds:60)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:59.072 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 8406, payload: 00 00 3C 01 , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:59.070 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 45--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.686 am [debug](http://192.168.0.50/device/edit/387)Parsed MultiChannelCmdEncap(bitAddress:false, command:5, commandClass:49, destinationEndPoint:2, parameter:[1, 68, 0, 0, 7, 201], res01:false, sourceEndPoint:2) to null

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.683 am [debug](http://192.168.0.50/device/edit/387)temperature Command : ['displayed':true, 'value':'67.9', 'isStateChange':true, 'linkText':One, 'name':'temperature', 'unit':'F']

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.681 am [debug](http://192.168.0.50/device/edit/387)map.unit : F

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.680 am [debug](http://192.168.0.50/device/edit/387)map.value : 67.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.678 am [debug](http://192.168.0.50/device/edit/387)((ftemp-state.lastReportedTemp).abs()>0.5625): false

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.676 am [debug](http://192.168.0.50/device/edit/387)state.lastReportedTemp: 67.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.675 am [debug](http://192.168.0.50/device/edit/387)ftemp : 67.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.674 am [debug](http://192.168.0.50/device/edit/387)(nowTime-state.lastReportTime > state.maxEventInterval) : false

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.673 am [debug](http://192.168.0.50/device/edit/387)nowTime : 1663852318664

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.672 am [debug](http://192.168.0.50/device/edit/387)state.lastReportTime : 1663852308689

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.671 am [debug](http://192.168.0.50/device/edit/387)state.maxEventInterval : 13800000

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.669 am [debug](http://192.168.0.50/device/edit/387)state.forcedWakeUp : true

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.668 am [debug](http://192.168.0.50/device/edit/387)'Date().getTime()' : 1663852318668

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.667 am [debug](http://192.168.0.50/device/edit/387)device.displayName : One

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.666 am [debug](http://192.168.0.50/device/edit/387)correction : 3.051757815342171E-7

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.664 am [debug](http://192.168.0.50/device/edit/387)cmd.scaledSensorValue : 19.93

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.663 am [debug](http://192.168.0.50/device/edit/387)ftemp : 67.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.662 am [debug](http://192.168.0.50/device/edit/387)ftempSign : 1.0

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.660 am [debug](http://192.168.0.50/device/edit/387)Command from endpoint 2: SensorMultilevelReport(precision:2, scale:0, sensorType:1, sensorValue:[0, 0, 7, 201], size:4, scaledSensorValue:19.93)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.655 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 600D, payload: 02 02 31 05 01 44 00 00 07 C9 , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.654 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 44--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.479 am [debug](http://192.168.0.50/device/edit/387)Parsed BasicSet(value:255) to [null, hubitat.device.HubMultiAction@21f1f8]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.476 am [debug](http://192.168.0.50/device/edit/387)cmdBlock : [8405, delay 1200, 600D02023104, delay 1200, 8408, delay 2000]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.475 am [debug](http://192.168.0.50/device/edit/387)wakeUpNoMoreInformation()

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.472 am [debug](http://192.168.0.50/device/edit/387)openClosed BasicSet(value:255)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.471 am [debug](http://192.168.0.50/device/edit/387)basicv1.BasicSet BasicSet(value:255)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.468 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 2001, payload: FF , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.467 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 43--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.396 am [debug](http://192.168.0.50/device/edit/387)Parsed SensorBinaryReport(sensorValue:255) to [null, hubitat.device.HubMultiAction@f4f83e]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.393 am [debug](http://192.168.0.50/device/edit/387)cmdBlock : [8405, delay 1200, 600D02023104, delay 1200, 8408, delay 2000]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.392 am [debug](http://192.168.0.50/device/edit/387)wakeUpNoMoreInformation()

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.389 am [debug](http://192.168.0.50/device/edit/387)openClosed SensorBinaryReport(sensorValue:255)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.388 am [debug](http://192.168.0.50/device/edit/387)sensorbinaryv1.SensorBinaryReport SensorBinaryReport(sensorValue:255)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.385 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 3003, payload: FF , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:58.384 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 42--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:50.258 am [debug](http://192.168.0.50/device/edit/387)Parsed BasicSet(value:0) to [null, hubitat.device.HubMultiAction@12b8a12]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:50.255 am [debug](http://192.168.0.50/device/edit/387)cmdBlock : [8405, delay 1200, 600D02023104, delay 1200, 8408, delay 2000]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:50.254 am [debug](http://192.168.0.50/device/edit/387)wakeUpNoMoreInformation()

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:50.251 am [debug](http://192.168.0.50/device/edit/387)openClosed BasicSet(value:0)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:50.250 am [debug](http://192.168.0.50/device/edit/387)basicv1.BasicSet BasicSet(value:0)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:50.247 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 2001, payload: 00 , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:50.246 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 41--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:50.240 am [debug](http://192.168.0.50/device/edit/387)Parsed SensorBinaryReport(sensorValue:0) to [null, hubitat.device.HubMultiAction@71e436]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:50.238 am [debug](http://192.168.0.50/device/edit/387)cmdBlock : [8405, delay 1200, 600D02023104, delay 1200, 8408, delay 2000]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:50.237 am [debug](http://192.168.0.50/device/edit/387)wakeUpNoMoreInformation()

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:50.234 am [debug](http://192.168.0.50/device/edit/387)openClosed SensorBinaryReport(sensorValue:0)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:50.233 am [debug](http://192.168.0.50/device/edit/387)sensorbinaryv1.SensorBinaryReport SensorBinaryReport(sensorValue:0)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:50.230 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 3003, payload: 00 , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:50.229 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 40--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:49.570 am [debug](http://192.168.0.50/device/edit/387)Parsed WakeUpIntervalReport(nodeid:1, seconds:60) to null

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:49.568 am [debug](http://192.168.0.50/device/edit/387)WakeUpIntervalReport WakeUpIntervalReport(nodeid:1, seconds:60)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:49.565 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 8406, payload: 00 00 3C 01 , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:49.563 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 39--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:49.536 am [debug](http://192.168.0.50/device/edit/387)Parsed BasicSet(value:255) to [null, hubitat.device.HubMultiAction@15e77aa]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:49.534 am [debug](http://192.168.0.50/device/edit/387)cmdBlock : [8405, delay 1200, 600D02023104, delay 1200, 8408, delay 2000]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:49.533 am [debug](http://192.168.0.50/device/edit/387)wakeUpNoMoreInformation()

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:49.530 am [debug](http://192.168.0.50/device/edit/387)openClosed BasicSet(value:255)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:49.528 am [debug](http://192.168.0.50/device/edit/387)basicv1.BasicSet BasicSet(value:255)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:49.526 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 2001, payload: FF , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:49.524 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 38--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:49.518 am [debug](http://192.168.0.50/device/edit/387)Parsed SensorBinaryReport(sensorValue:255) to [null, hubitat.device.HubMultiAction@ed5478]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:49.515 am [debug](http://192.168.0.50/device/edit/387)cmdBlock : [8405, delay 1200, 600D02023104, delay 1200, 8408, delay 2000]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:49.514 am [debug](http://192.168.0.50/device/edit/387)wakeUpNoMoreInformation()

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:49.511 am [debug](http://192.168.0.50/device/edit/387)openClosed SensorBinaryReport(sensorValue:255)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:49.510 am [debug](http://192.168.0.50/device/edit/387)sensorbinaryv1.SensorBinaryReport SensorBinaryReport(sensorValue:255)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:49.507 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 3003, payload: FF , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:49.505 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 37--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.710 am [debug](http://192.168.0.50/device/edit/387)Parsed MultiChannelCmdEncap(bitAddress:false, command:5, commandClass:49, destinationEndPoint:2, parameter:[1, 68, 0, 0, 7, 201], res01:false, sourceEndPoint:2) to null

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.707 am [debug](http://192.168.0.50/device/edit/387)temperature Command : ['displayed':true, 'value':'67.9', 'isStateChange':true, 'linkText':One, 'name':'temperature', 'unit':'F']

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.705 am [debug](http://192.168.0.50/device/edit/387)map.unit : F

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.704 am [debug](http://192.168.0.50/device/edit/387)map.value : 67.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.702 am [debug](http://192.168.0.50/device/edit/387)((ftemp-state.lastReportedTemp).abs()>0.5625): false

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.700 am [debug](http://192.168.0.50/device/edit/387)state.lastReportedTemp: 67.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.700 am [debug](http://192.168.0.50/device/edit/387)ftemp : 67.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.698 am [debug](http://192.168.0.50/device/edit/387)(nowTime-state.lastReportTime > state.maxEventInterval) : false

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.697 am [debug](http://192.168.0.50/device/edit/387)nowTime : 1663852308689

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.696 am [debug](http://192.168.0.50/device/edit/387)state.lastReportTime : 1663852302500

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.695 am [debug](http://192.168.0.50/device/edit/387)state.maxEventInterval : 13800000

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.694 am [debug](http://192.168.0.50/device/edit/387)state.forcedWakeUp : true

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.693 am [debug](http://192.168.0.50/device/edit/387)'Date().getTime()' : 1663852308693

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.692 am [debug](http://192.168.0.50/device/edit/387)device.displayName : One

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.691 am [debug](http://192.168.0.50/device/edit/387)correction : 3.051757815342171E-7

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.690 am [debug](http://192.168.0.50/device/edit/387)cmd.scaledSensorValue : 19.93

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.688 am [debug](http://192.168.0.50/device/edit/387)ftemp : 67.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.687 am [debug](http://192.168.0.50/device/edit/387)ftempSign : 1.0

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.685 am [debug](http://192.168.0.50/device/edit/387)Command from endpoint 2: SensorMultilevelReport(precision:2, scale:0, sensorType:1, sensorValue:[0, 0, 7, 201], size:4, scaledSensorValue:19.93)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.680 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 600D, payload: 02 02 31 05 01 44 00 00 07 C9 , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.679 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 36--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.148 am [debug](http://192.168.0.50/device/edit/387)Parsed WakeUpIntervalReport(nodeid:1, seconds:60) to null

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.146 am [debug](http://192.168.0.50/device/edit/387)WakeUpIntervalReport WakeUpIntervalReport(nodeid:1, seconds:60)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.143 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 8406, payload: 00 00 3C 01 , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.142 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 35--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.115 am [debug](http://192.168.0.50/device/edit/387)Parsed BasicSet(value:0) to [null, hubitat.device.HubMultiAction@51505e]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.113 am [debug](http://192.168.0.50/device/edit/387)cmdBlock : [8405, delay 1200, 600D02023104, delay 1200, 8408, delay 2000]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.111 am [debug](http://192.168.0.50/device/edit/387)wakeUpNoMoreInformation()

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.109 am [debug](http://192.168.0.50/device/edit/387)openClosed BasicSet(value:0)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.107 am [debug](http://192.168.0.50/device/edit/387)basicv1.BasicSet BasicSet(value:0)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.105 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 2001, payload: 00 , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.103 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 34--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.097 am [debug](http://192.168.0.50/device/edit/387)Parsed SensorBinaryReport(sensorValue:0) to [null, hubitat.device.HubMultiAction@e635b]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.094 am [debug](http://192.168.0.50/device/edit/387)cmdBlock : [8405, delay 1200, 600D02023104, delay 1200, 8408, delay 2000]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.093 am [debug](http://192.168.0.50/device/edit/387)wakeUpNoMoreInformation()

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.090 am [debug](http://192.168.0.50/device/edit/387)openClosed SensorBinaryReport(sensorValue:0)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.089 am [debug](http://192.168.0.50/device/edit/387)sensorbinaryv1.SensorBinaryReport SensorBinaryReport(sensorValue:0)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.086 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 3003, payload: 00 , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:48.085 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 33--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.714 am [debug](http://192.168.0.50/device/edit/387)Parsed WakeUpIntervalReport(nodeid:1, seconds:60) to null

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.712 am [debug](http://192.168.0.50/device/edit/387)WakeUpIntervalReport WakeUpIntervalReport(nodeid:1, seconds:60)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.710 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 8406, payload: 00 00 3C 01 , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.708 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 32--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.684 am [debug](http://192.168.0.50/device/edit/387)Parsed BasicSet(value:255) to [null, hubitat.device.HubMultiAction@14f82b4]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.682 am [debug](http://192.168.0.50/device/edit/387)cmdBlock : [8405, delay 1200, 600D02023104, delay 1200, 8408, delay 2000]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.681 am [debug](http://192.168.0.50/device/edit/387)wakeUpNoMoreInformation()

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.671 am [debug](http://192.168.0.50/device/edit/387)openClosed BasicSet(value:255)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.669 am [debug](http://192.168.0.50/device/edit/387)basicv1.BasicSet BasicSet(value:255)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.666 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 2001, payload: FF , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.665 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 31--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.660 am [debug](http://192.168.0.50/device/edit/387)Parsed SensorBinaryReport(sensorValue:255) to [null, hubitat.device.HubMultiAction@15e8576]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.657 am [debug](http://192.168.0.50/device/edit/387)cmdBlock : [8405, delay 1200, 600D02023104, delay 1200, 8408, delay 2000]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.656 am [debug](http://192.168.0.50/device/edit/387)wakeUpNoMoreInformation()

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.653 am [debug](http://192.168.0.50/device/edit/387)openClosed SensorBinaryReport(sensorValue:255)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.652 am [debug](http://192.168.0.50/device/edit/387)sensorbinaryv1.SensorBinaryReport SensorBinaryReport(sensorValue:255)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.649 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 3003, payload: FF , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.648 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 30--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.481 am [debug](http://192.168.0.50/device/edit/387)Parsed WakeUpIntervalReport(nodeid:1, seconds:60) to null

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.479 am [debug](http://192.168.0.50/device/edit/387)WakeUpIntervalReport WakeUpIntervalReport(nodeid:1, seconds:60)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.476 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 8406, payload: 00 00 3C 01 , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.475 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 29--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.450 am [debug](http://192.168.0.50/device/edit/387)Parsed BasicSet(value:0) to [null, hubitat.device.HubMultiAction@1f55f98]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.447 am [debug](http://192.168.0.50/device/edit/387)cmdBlock : [8405, delay 1200, 600D02023104, delay 1200, 8408, delay 2000]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.446 am [debug](http://192.168.0.50/device/edit/387)wakeUpNoMoreInformation()

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.443 am [debug](http://192.168.0.50/device/edit/387)openClosed BasicSet(value:0)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.442 am [debug](http://192.168.0.50/device/edit/387)basicv1.BasicSet BasicSet(value:0)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.439 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 2001, payload: 00 , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.438 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 28--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.430 am [debug](http://192.168.0.50/device/edit/387)Parsed SensorBinaryReport(sensorValue:0) to [null, hubitat.device.HubMultiAction@fcc2fe]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.427 am [debug](http://192.168.0.50/device/edit/387)cmdBlock : [8405, delay 1200, 600D02023104, delay 1200, 8408, delay 2000]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.426 am [debug](http://192.168.0.50/device/edit/387)wakeUpNoMoreInformation()

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.424 am [debug](http://192.168.0.50/device/edit/387)openClosed SensorBinaryReport(sensorValue:0)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.422 am [debug](http://192.168.0.50/device/edit/387)sensorbinaryv1.SensorBinaryReport SensorBinaryReport(sensorValue:0)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.420 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 3003, payload: 00 , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:47.418 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 27--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:42.524 am [debug](http://192.168.0.50/device/edit/387)Parsed MultiChannelCmdEncap(bitAddress:false, command:5, commandClass:49, destinationEndPoint:2, parameter:[1, 68, 0, 0, 7, 201], res01:false, sourceEndPoint:2) to null

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:42.521 am [debug](http://192.168.0.50/device/edit/387)temperature Command : ['displayed':true, 'value':'67.9', 'isStateChange':true, 'linkText':One, 'name':'temperature', 'unit':'F']

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:42.519 am [debug](http://192.168.0.50/device/edit/387)map.unit : F

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:42.519 am [debug](http://192.168.0.50/device/edit/387)map.value : 67.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:42.514 am [debug](http://192.168.0.50/device/edit/387)((ftemp-state.lastReportedTemp).abs()>0.5625): false

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:42.512 am [debug](http://192.168.0.50/device/edit/387)state.lastReportedTemp: 67.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:42.511 am [debug](http://192.168.0.50/device/edit/387)ftemp : 67.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:42.509 am [debug](http://192.168.0.50/device/edit/387)(nowTime-state.lastReportTime > state.maxEventInterval) : false

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:42.508 am [debug](http://192.168.0.50/device/edit/387)nowTime : 1663852302500

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:42.507 am [debug](http://192.168.0.50/device/edit/387)state.lastReportTime : 1663852242889

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:42.506 am [debug](http://192.168.0.50/device/edit/387)state.maxEventInterval : 13800000

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:42.505 am [debug](http://192.168.0.50/device/edit/387)state.forcedWakeUp : true

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:42.504 am [debug](http://192.168.0.50/device/edit/387)'Date().getTime()' : 1663852302503

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:42.503 am [debug](http://192.168.0.50/device/edit/387)device.displayName : One

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:42.501 am [debug](http://192.168.0.50/device/edit/387)correction : 3.051757815342171E-7

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:42.500 am [debug](http://192.168.0.50/device/edit/387)cmd.scaledSensorValue : 19.93

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:42.499 am [debug](http://192.168.0.50/device/edit/387)ftemp : 67.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:42.498 am [debug](http://192.168.0.50/device/edit/387)ftempSign : 1.0

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:42.495 am [debug](http://192.168.0.50/device/edit/387)Command from endpoint 2: SensorMultilevelReport(precision:2, scale:0, sensorType:1, sensorValue:[0, 0, 7, 201], size:4, scaledSensorValue:19.93)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:42.491 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 600D, payload: 02 02 31 05 01 44 00 00 07 C9 , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:42.490 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 26--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:41.294 am [debug](http://192.168.0.50/device/edit/387)Parsed WakeUpIntervalReport(nodeid:1, seconds:60) to null

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:41.292 am [debug](http://192.168.0.50/device/edit/387)WakeUpIntervalReport WakeUpIntervalReport(nodeid:1, seconds:60)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:41.289 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 8406, payload: 00 00 3C 01 , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:41.288 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 25--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:41.254 am [debug](http://192.168.0.50/device/edit/387)Parsed BasicSet(value:255) to [null, hubitat.device.HubMultiAction@1274328]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:41.252 am [debug](http://192.168.0.50/device/edit/387)cmdBlock : [8405, delay 1200, 600D02023104, delay 1200, 8408, delay 2000]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:41.251 am [debug](http://192.168.0.50/device/edit/387)wakeUpNoMoreInformation()

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:41.248 am [debug](http://192.168.0.50/device/edit/387)openClosed BasicSet(value:255)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:41.246 am [debug](http://192.168.0.50/device/edit/387)basicv1.BasicSet BasicSet(value:255)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:41.242 am [debug](http://192.168.0.50/device/edit/387)Parsed SensorBinaryReport(sensorValue:255) to [null, hubitat.device.HubMultiAction@1106a40]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:41.239 am [debug](http://192.168.0.50/device/edit/387)cmdBlock : [8405, delay 1200, 600D02023104, delay 1200, 8408, delay 2000]

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:41.238 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 2001, payload: FF , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:41.238 am [debug](http://192.168.0.50/device/edit/387)wakeUpNoMoreInformation()

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:41.237 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 24--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:41.235 am [debug](http://192.168.0.50/device/edit/387)openClosed SensorBinaryReport(sensorValue:255)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:41.233 am [debug](http://192.168.0.50/device/edit/387)sensorbinaryv1.SensorBinaryReport SensorBinaryReport(sensorValue:255)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:41.224 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 3003, payload: FF , isMulticast: false'

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:41.223 am [debug](http://192.168.0.50/device/edit/387)--------------------------Parsing... ; state.parseCount: 24--------------------------

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:28.579 am [debug](http://192.168.0.50/device/edit/387)Parsed MultiChannelCmdEncap(bitAddress:false, command:5, commandClass:49, destinationEndPoint:2, parameter:[1, 68, 0, 0, 7, 201], res01:false, sourceEndPoint:2) to null

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:28.577 am [debug](http://192.168.0.50/device/edit/387)((ftemp-state.lastReportedTemp).abs()>0.5625): false

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:28.575 am [debug](http://192.168.0.50/device/edit/387)state.lastReportedTemp: 67.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:28.574 am [debug](http://192.168.0.50/device/edit/387)ftemp : 67.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:28.573 am [debug](http://192.168.0.50/device/edit/387)(nowTime-state.lastReportTime > state.maxEventInterval) : false

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:28.572 am [debug](http://192.168.0.50/device/edit/387)nowTime : 1663852288564

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:28.571 am [debug](http://192.168.0.50/device/edit/387)state.lastReportTime : 1663852242889

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:28.570 am [debug](http://192.168.0.50/device/edit/387)state.maxEventInterval : 13800000

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:28.569 am [debug](http://192.168.0.50/device/edit/387)state.forcedWakeUp : false

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:28.568 am [debug](http://192.168.0.50/device/edit/387)'Date().getTime()' : 1663852288567

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:28.567 am [debug](http://192.168.0.50/device/edit/387)device.displayName : One

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:28.565 am [debug](http://192.168.0.50/device/edit/387)correction : 3.051757815342171E-7

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:28.564 am [debug](http://192.168.0.50/device/edit/387)cmd.scaledSensorValue : 19.93

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:28.563 am [debug](http://192.168.0.50/device/edit/387)ftemp : 67.9

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:28.562 am [debug](http://192.168.0.50/device/edit/387)ftempSign : 1.0

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:28.559 am [debug](http://192.168.0.50/device/edit/387)Command from endpoint 2: SensorMultilevelReport(precision:2, scale:0, sensorType:1, sensorValue:[0, 0, 7, 201], size:4, scaledSensorValue:19.93)

[dev:387](http://192.168.0.50/logs?device=387#pastdev387)2022-09-22 09:11:28.555 am [debug](http://192.168.0.50/device/edit/387)Parsing... 'zw device: 18, command: 600D, payload: 02 02 31 05 01 44 00 00 07 C9 , isMulticast: false'

Here is the driver config screen:

It is logging temp every minute (cup of hot water test) as configured in that screen grab above which is the first time since we started playing :slight_smile:

Is Debug 1 more or less verbose than Debug 3?

What would be the option to just report when temp delta is at the set point? Or will it just do this when wakeup is set longer, but the temp changes?

Great, thanks for testing.

Level 1 has everything, 3 has "important" stuff. I used whatever levels were there before but made a few adjustments.

Your wake-up is set to 60 seconds, I changed the preferences from minutes to seconds in the latest version since this is what the parameter accepts. If you change the value to 3600, you should get exactly the same behavior as before.

Just a reminder to anyone reading this that once you "save preferences", the sensor will not get updated until it wakes-up either from the periodic wake up or manual (alarm or contact triggered).

Also thanks for the screen grab, I wasn't sure if the firmware version (2.5) would show-up correctly.

Strange that the driver version doesn't show. I will add it to the updated() function as I did for another driver...

Actually temp is updating based on my delta setting of 5, not on time so this is excellent. I'm going to change parameter 12 to 2 which should give me a delta T report when temperature change exceeds 0.125 C

I'm finding I need to give the rear TMP button a solid press/release, then click "Configure" in the driver a few seconds after. The sensor also needs to be relatively close to the hub when including initially. Moving it outside required a few Zwave repair cycles in the hub so they communicate correctly. I do like HE a lot better with respect to being able to sort Zwave topology issues.

With this sensor, you also need to make sure the internal TMP button is kept depressed either manually, or by keeping the cover on when including/excluding/resetting etc. It's a bit of a PITA, but they work so reliably after, I've found it "worth" the effort to sort them.

I did get the Fibaro Implant today and of course it's far easier to get working, but it's not designed for battery power. Doable with a larger battery/solar cell but I'll be using it for other projects.

1 Like

Yes, I can see that after looking more closely at the logs. The wake-up notifications still come out every minute as expected. I guess you would want to change that if you were only on battery...

Also, on every wake-up, there are a few commands always sent to the sensor, wakeUpIntervalGet, SensorMultilevelGet, so you will get extra temperature measurements.

I'll play around a bit with those settings. In any case, the sensor is working great now.

I've just set up a Fibaro Implant which is pretty slick and a lot easier to add into Hubitat! It's not quite so power efficient as these older FGK-10x sensors though...I believe the implant needs 20mA or so constant. I'll use that for another project(s)

@christi999 ,is there a release mechanism for the driver, or it is just left here for folks to find via google? You did a pretty amazing job of jumping in and sorting this out :slight_smile:

Everything has been good on the three 2.5 firmware sensors using the driver and the temp reporting makes sense now:

Wakeup period will determine the "potential" temperature reporting window, but the temp report won't be sent unless the temp delta is greater than what is set in option 12. I've got option12 set to 2, and a wakeup of 120 seconds for two of the sensors, but I don't get reports every 120 seconds...only if the temp difference is greater than about 0.3 F.

Option 12 as per the doc:

Parameter no. 12
Sensitivity to temperature changes. The maximum acceptable
difference between the last reported temperature and the current
temperature read from the sensor. If the temperatures differ by the
set value or more, a report with the current temperature value is
sent to the device assigned to association group no. 3.
Default value: 8 [0,5o
C]
Available parameter settings: 0 – 255 [0o
C to 16o
C] [32o
F – 60,8o
F]
To set an appropriate parameter value use the following formula:
x = delta T x 16 - for Celsius
x = delta T x 80 / 9 - for Fahrenheit
x = parameter value
delta T – maximum acceptable temperature gradient in Celsius or
Fahrenheit
If the value is set to 0:

  • if the wake-up interval is set to 255 seconds, temperature report
    will be sent according to the interval,
  • if the wake-up interval is set to over 255, temperature report will be
    sent each ca. 4 minutes.
    Parameter size: 1 [byte].

There is a custom driver forum (link) where it could be posted/discussed. In addition, it should be added to the custom driver page (link).

Ideally the driver should be put on github for easy access and once it is there, it should be added to the Hubitat Package Manager (link) for easy install.

Given how old this device is, I am not sure it is worth the effort but you are welcome to it...

The device works as described...However, for some reason the driver code actually asks the device for a temperature report on every wake-up and filters every report based on if it has changed enough. I left that in the code, maybe the author liked it that way or it solves problems when battery is low...