Integration of z-Wave /danfoss thermostatw

Excellent work here, I have this working perfectly with a 014G0013 SW 1.01 version of the TRV.

Can I ask what version of TRV you guys have this working with? Has anyone got it working with a version of the FW other than the one listed above?

Thanks

Shameful bump.

Does anyone have this working on sw 2.51 version?

Thx

+1

I’ve sw 2.51 working on raZberry but it sounds like SmartThings hub isn’t worth the risk.

Are you saying that you don’t have ST?

I’m curious about 2.51 because you can pick them up for half the price of the later 1.01 FW if you look around.

Good news.

I’ve just received a second hand version of the TRV with firmware 2.51 (see the chart above).

Good news is that it works exactly as the 1.01 version did.

Looks good! Result!

Hey There :slight_smile:

it’s not a message for solving or a new solution. My Status is that the main Problem called E5 with Danfoss Thermostats can be fixed. Not for 100% but for a reasonable conditon.

I only want to give a big thanks to the guys who helped me…and I’m sure a lot of others in the world! (more in Europe with the most missing Smartthings-officially-Support :smiley: )

I’m a german student and not really close to programing. My english is not pretty good as it should after main-School, but I try my best.
I read much about smartthings and about my annoying Danfoss (in Germany called “Devolo”, a also big Company use it too and made a partnership with Danfoss - but no doubt the same product)
I have started the last two days to search about my E5 Problem and the issue after 30mins loosing Connection and showing E5. The first evening after a looong reading day was chastening. For real. I though I couldnt find any way for understanding, because nobody use german and the most presuppose certain skills in smartthings and not only a user who installed products and use it without problems as I do before :wink:

But the understanding came in the next day and the point that “Device Handlers” are a Software close to the orginal which I can install and overwrite my existing. For example my Thermostats. The surface in the most cases Change with the new IDE copied script when you click in the smartthings app to the “new installed Thing”.
And a new knowledge is a smartapp called CORE. Its a massive and heavy useful program which can control like IFTTT.

I would help everybody like this three guys, if I could. Not each of them is a superuser and a programer I think, but they try (tried) their BEST ! :slight_smile:

@richp
With his new and brilliant working Danfoss LC13 TRV V0.7 ! (so happy and pleased that I can change my wakeUp-Intervall and the much better working Surface with the rasterd sliders!)


…also a comment makes hope for the future:
Quote: “Good news on that front. I’m working with ST to get this certified following a prod from Danfoss. Process has only just started so I guess it will take a bit of time before its all official. :smiley:

@danielccm
This guy is really persistent and willing to solve his (5E haha) and the others problems - Dani, Thank you from all my heart! :smile:
Main theme and discussions about the starting problem and the long path to solve it (not so for me, because the solution is now available since a couple of weeks/months ^^)
ttps://community.smartthings.com/t/integration-of-z-wave-danfoss-thermostat/23310/123

@ smgran (as new user I only can named two users :frowning:) - search for this guy if you want
Yeah I mean you…ist the wrong topic over here, but your really really pictured and detailed way to descripe CORE helped me a lot! - Thank you too :wink:

I think everybody knows the feeling when you find a way to make your life easier and share your problems and at the end of the day you got a Problem less. (don’t know if the sentences are right - but you know what I mean :smile:

Greetings to all from the cold Germany (so happy that Thermostats work :smile:)
Stay strong in the hard but so customable smartthings world.

  • This message was created to say THANKS ! -
3 Likes

Im using 4x Danfoss SW 1.00 - works fine now with the new IDE :slight_smile:

1 Like

Thanks for the comments and glad to hear it works for you.

1 Like

@richp
I got a little question. I want the Surface showing current temperature. The UI I already have. But it doesnt change the temp. I have to create an “Event” for updating the current temp. Great if it can set to every hour updated.

May you write the code for me please?
I searched such a long time, but itshard for me to understand. :disappointed_relieved:
The code based from your stock

//UI configuration
tiles {
// Main Tile displays current temperature recieved from thermostat.
// Background color changes with temp.
valueTile(“temperature”, “device.Temperature”, width: 3, height: 2) {
state(“temperature”, label:’${currentValue}°’,
backgroundColors:[
[value: 0, color: “#ededed”],
[value: 4, color: “#153591”], //blue
[value: 16, color: “#178998”],
[value: 18, color: “#99FFCC”],
[value: 20, color: “#99FF33”],//green
[value: 21, color: “#99FF00”],
[value: 24, color: “#66CC00”],
[value: 28, color: “#666600”],
[value: 30, color: “#660000”],
]
)
}

It would be great if you can help again :wink:

Hi, are you looking to display the actual temperature? If so the valve doesn’t report this, only the set point temperature. You would need to buy a separate sensor for this such as the Samsung motion / temp sensor.

ah damn :smiley:
Alright - but thanks again :wink:

I’ll try to catch the temp from my Fibaro Smokes and build in it.


whats about this @richp?
In the past it have showed the temps. ´Can you explain it?

Do you think you can build the temperature feautre in yours @richp?
Sorry if annoy you but you could do me a huge favour :slight_smile:

This is the Code from a guy who sending temps with his Thermosats. The Code works not very well for me but the temperature is sending every changing:

metadata {

// Automatically generated. Make future change here.

definition (name: “Z-Wave thermostat with battery level_1”, author: "minollo@minollo.com") {

  capability "Relative Humidity Measurement"
  capability "Battery"
  capability "Temperature Measurement"
  capability "Thermostat"
  capability "Polling"
  command "poll"
  attribute "responsive", "string"

}

// simulator metadata

simulator {

  status "off"			: "command: 4003, payload: 00"
  status "heat"			: "command: 4003, payload: 01"
  status "cool"			: "command: 4003, payload: 02"
  status "auto"			: "command: 4003, payload: 03"
  status "emergencyHeat"	: "command: 4003, payload: 04"
  status "fanAuto"		: "command: 4403, payload: 00"
  status "fanOn"			: "command: 4403, payload: 01"
  status "fanCirculate"	: "command: 4403, payload: 06"
  status "heat 60"        : "command: 4303, payload: 01 01 3C"
  status "heat 68"        : "command: 4303, payload: 01 01 44"
  status "heat 72"        : "command: 4303, payload: 01 01 48"
  status "cool 72"        : "command: 4303, payload: 02 01 48"
  status "cool 76"        : "command: 4303, payload: 02 01 4C"
  status "cool 80"        : "command: 4303, payload: 02 01 50"
  status "temp 58"        : "command: 3105, payload: 01 22 02 44"
  status "temp 62"        : "command: 3105, payload: 01 22 02 6C"
  status "temp 70"        : "command: 3105, payload: 01 22 02 BC"
  status "temp 74"        : "command: 3105, payload: 01 22 02 E4"
  status "temp 78"        : "command: 3105, payload: 01 22 03 0C"
  status "temp 82"        : "command: 3105, payload: 01 22 03 34"
  status "idle"			: "command: 4203, payload: 00"
  status "heating"		: "command: 4203, payload: 01"
  status "cooling"		: "command: 4203, payload: 02"
  status "fan only"		: "command: 4203, payload: 03"
  status "pending heat"	: "command: 4203, payload: 04"
  status "pending cool"	: "command: 4203, payload: 05"
  status "vent economizer": "command: 4203, payload: 06"
  // reply messages
  reply "2502": "command: 2503, payload: FF"

}

tiles {

  valueTile("temperature", "device.temperature", width: 2, height: 2) {
  	state("temperature", label:'${currentValue}°', unit:"C",
  		backgroundColors:[
  			[value: 31, color: "#153591"],
  			[value: 44, color: "#1e9cbb"],
  			[value: 59, color: "#90d2a7"],
  			[value: 74, color: "#44b621"],
  			[value: 84, color: "#f1d801"],
  			[value: 95, color: "#d04e00"],
  			[value: 96, color: "#bc2323"]
  		]
  	)
  }
  standardTile("mode", "device.thermostatMode", inactiveLabel: false, decoration: "flat") {
  	state "off", label:'${name}', action:"switchMode"
  	state "heat", label:'${name}', action:"switchMode"
  	state "emergencyHeat", label:'${name}', action:"switchMode"
  	state "cool", label:'${name}', action:"switchMode"
  	state "auto", label:'${name}', action:"switchMode"
  }
  standardTile("fanMode", "device.thermostatFanMode", inactiveLabel: false, decoration: "flat") {
  	state "fanAuto", label:'${name}', action:"switchFanMode"
  	state "fanOn", label:'${name}', action:"switchFanMode"
  	state "fanCirculate", label:'${name}', action:"switchFanMode"
  }
  controlTile("heatSliderControl", "device.heatingSetpoint", "slider", height: 1, width: 2, inactiveLabel: false, range:"(4..28)" ) {
  	state "setHeatingSetpoint", action:"thermostat.setHeatingSetpoint", backgroundColor:"#d04e00"
  }
  valueTile("heatingSetpoint", "device.heatingSetpoint", inactiveLabel: false, decoration: "flat") {
  	state "heat", label:'${currentValue}° heat', unit:"C", backgroundColor:"#ffffff"
  }
  controlTile("coolSliderControl", "device.coolingSetpoint", "slider", height: 1, width: 2, inactiveLabel: false) {
  	state "setCoolingSetpoint", action:"thermostat.setCoolingSetpoint", backgroundColor: "#1e9cbb"
  }
  valueTile("coolingSetpoint", "device.coolingSetpoint", inactiveLabel: false, decoration: "flat") {
  	state "cool", label:'${currentValue}° cool', unit:"C", backgroundColor:"#ffffff"
  }
  standardTile("refresh", "device.thermostatMode", inactiveLabel: false, decoration: "flat") {
  	state "default", action:"polling.poll", icon:"st.secondary.refresh"
  }
  standardTile("configure", "device.configure", inactiveLabel: false, decoration: "flat") {
  	state "configure", label:'', action:"configuration.configure", icon:"st.secondary.configure"
  }
  main "temperature"
  details(["temperature", "mode", "fanMode", "heatSliderControl", "heatingSetpoint", "coolSliderControl", "coolingSetpoint", "refresh", "configure"])

}

}

def parse(String description)

{

def map = createEvent(zwaveEvent(zwave.parse(description, [0x42:1, 0x43:2, 0x31:3, 0x80:1])))

if (!map) {

  return null

}

updateResponsiveness()

def result = [map]

if (map.isStateChange && map.name in [“heatingSetpoint”,“coolingSetpoint”,“thermostatMode”]) {

  def map2 = [
  	name: "thermostatSetpoint",
  	unit: "C"
  ]
  if (map.name == "thermostatMode") {
  	updateState("lastTriedMode", map.value)
  	if (map.value == "cool") {
  		map2.value = device.latestValue("coolingSetpoint")
  		log.info "THERMOSTAT, latest cooling setpoint = ${map2.value}"
  	}
  	else {
  		map2.value = device.latestValue("heatingSetpoint")
  		log.info "THERMOSTAT, latest heating setpoint = ${map2.value}"
  	}
  }
  else {
  	def mode = device.latestValue("thermostatMode")
  	log.info "THERMOSTAT, latest mode = ${mode}"
  	if ((map.name == "heatingSetpoint" && mode == "heat") || (map.name == "coolingSetpoint" && mode == "cool")) {
  		map2.value = map.value
  		map2.unit = map.unit
  	}
  }
  if (map2.value != null) {
  	log.debug "THERMOSTAT, adding setpoint event: $map"
  	result << createEvent(map2)
  } else {
  	log.debug "THERMOSTAT, ignoring setpoint event: $map"
    }

} else if (map.name == “thermostatFanMode” && map.isStateChange) {

  updateState("lastTriedFanMode", map.value)

}

log.debug “ParseEx returned $result”

result

}

// Event Generation

def zwaveEvent(physicalgraph.zwave.commands.batteryv1.BatteryReport cmd) {

def nowTime = new Date().time

state.lastBatteryGet = nowTime

def map = [ name: “battery”, unit: “%” ]

if (cmd.batteryLevel == 0xFF || cmd.batteryLevel == 0) {

  map.value = 1
  map.descriptionText = "$device.displayName battery is low!"
} else {
  map.value = cmd.batteryLevel

}

map

}

def zwaveEvent(physicalgraph.zwave.commands.thermostatsetpointv2.ThermostatSetpointReport cmd)

{

def map = [:]

map.value = cmd.scaledValue.toString()

map.unit = cmd.scale == 1 ? “F” : “C”

map.displayed = false

switch (cmd.setpointType) {

  case 1:
  	map.name = "heatingSetpoint"
  	break;
  case 2:
  	map.name = "coolingSetpoint"
  	break;
  default:
  	return [:]

}

// So we can respond with same format

state.size = cmd.size

state.scale = cmd.scale

state.precision = cmd.precision

map

}

def zwaveEvent(physicalgraph.zwave.commands.sensormultilevelv3.SensorMultilevelReport cmd)

{

log.debug “SensorMultilevelReport ${cmd}”

def map = [:]

switch (cmd.sensorType) {

  case 1:
  	// temperature
  	map.value = cmd.scaledSensorValue.toString()
  	map.unit = cmd.scale == 1 ? "F" : "C"
  	map.name = "temperature"
  	break;
  case 5:
  	// humidity
  	map.value = cmd.scaledSensorValue.toInteger().toString()
  	map.unit = "%"
  	map.name = "humidity"
  	break;

}

map

}

def zwaveEvent(physicalgraph.zwave.commands.thermostatoperatingstatev1.ThermostatOperatingStateReport cmd)

{

def map = [:]

switch (cmd.operatingState) {

  case physicalgraph.zwave.commands.thermostatoperatingstatev1.ThermostatOperatingStateReport.OPERATING_STATE_IDLE:
  	map.value = "idle"
  	break
  case physicalgraph.zwave.commands.thermostatoperatingstatev1.ThermostatOperatingStateReport.OPERATING_STATE_HEATING:
  	map.value = "heating"
  	break
  case physicalgraph.zwave.commands.thermostatoperatingstatev1.ThermostatOperatingStateReport.OPERATING_STATE_COOLING:
  	map.value = "cooling"
  	break
  case physicalgraph.zwave.commands.thermostatoperatingstatev1.ThermostatOperatingStateReport.OPERATING_STATE_FAN_ONLY:
  	map.value = "fan only"
  	break
  case physicalgraph.zwave.commands.thermostatoperatingstatev1.ThermostatOperatingStateReport.OPERATING_STATE_PENDING_HEAT:
  	map.value = "pending heat"
  	break
  case physicalgraph.zwave.commands.thermostatoperatingstatev1.ThermostatOperatingStateReport.OPERATING_STATE_PENDING_COOL:
  	map.value = "pending cool"
  	break
  case physicalgraph.zwave.commands.thermostatoperatingstatev1.ThermostatOperatingStateReport.OPERATING_STATE_VENT_ECONOMIZER:
  	map.value = "vent economizer"
  	break

}

map.name = “thermostatOperatingState”

map

}

def zwaveEvent(physicalgraph.zwave.commands.thermostatmodev2.ThermostatModeReport cmd) {

def map = [:]

switch (cmd.mode) {

  case physicalgraph.zwave.commands.thermostatmodev2.ThermostatModeReport.MODE_OFF:
  	map.value = "off"
  	break
  case physicalgraph.zwave.commands.thermostatmodev2.ThermostatModeReport.MODE_HEAT:
  	map.value = "heat"
  	break
  case physicalgraph.zwave.commands.thermostatmodev2.ThermostatModeReport.MODE_AUXILIARY_HEAT:
  	map.value = "emergencyHeat"
  	break
  case physicalgraph.zwave.commands.thermostatmodev2.ThermostatModeReport.MODE_COOL:
  	map.value = "cool"
  	break
  case physicalgraph.zwave.commands.thermostatmodev2.ThermostatModeReport.MODE_AUTO:
  	map.value = "auto"
  	break

}

map.name = “thermostatMode”

map

}

def zwaveEvent(physicalgraph.zwave.commands.thermostatfanmodev3.ThermostatFanModeReport cmd) {

def map = [:]

switch (cmd.fanMode) {

  case physicalgraph.zwave.commands.thermostatfanmodev3.ThermostatFanModeReport.FAN_MODE_AUTO_LOW:
  	map.value = "fanAuto"
  	break
  case physicalgraph.zwave.commands.thermostatfanmodev3.ThermostatFanModeReport.FAN_MODE_LOW:
  	map.value = "fanOn"
  	break
  case physicalgraph.zwave.commands.thermostatfanmodev3.ThermostatFanModeReport.FAN_MODE_CIRCULATION:
  	map.value = "fanCirculate"
  	break

}

map.name = “thermostatFanMode”

map.displayed = false

map

}

def zwaveEvent(physicalgraph.zwave.commands.thermostatmodev2.ThermostatModeSupportedReport cmd) {

def supportedModes = “”

if(cmd.off) { supportedModes += "off " }

if(cmd.heat) { supportedModes += "heat " }

if(cmd.auxiliaryemergencyHeat) { supportedModes += "emergencyHeat " }

if(cmd.cool) { supportedModes += "cool " }

if(cmd.auto) { supportedModes += "auto " }

updateState(“supportedModes”, supportedModes)

}

def zwaveEvent(physicalgraph.zwave.commands.thermostatfanmodev3.ThermostatFanModeSupportedReport cmd) {

def supportedFanModes = “”

if(cmd.auto) { supportedFanModes += "fanAuto " }

if(cmd.low) { supportedFanModes += "fanOn " }

if(cmd.circulation) { supportedFanModes += "fanCirculate " }

updateState(“supportedFanModes”, supportedFanModes)

}

def updateState(String name, String value) {

state[name] = value

device.updateDataValue(name, value)

}

def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicReport cmd) {

log.debug “Zwave event received: $cmd”

}

def zwaveEvent(physicalgraph.zwave.Command cmd) {

log.warn “Unexpected zwave command $cmd”

}

// Command Implementations

def poll() {

checkResponsiveness()

delayBetween([

  zwave.sensorMultilevelV3.sensorMultilevelGet().format(), // current temperature
  zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 1).format(),
  zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 2).format(),
  zwave.thermostatModeV2.thermostatModeGet().format(),
  zwave.thermostatFanModeV3.thermostatFanModeGet().format(),
  zwave.thermostatOperatingStateV1.thermostatOperatingStateGet().format(),
  getBattery(),
    setClock()

], 2300)

}

private getBattery() { //once every 10 hours

def nowTime = new Date().time

def ageInMinutes = state.lastBatteryGet ? (nowTime - state.lastBatteryGet)/60000 : 600

log.debug "Battery report age: ${ageInMinutes} minutes"
if (ageInMinutes >= 600) {
    log.debug "Fetching fresh battery value"
  zwave.batteryV1.batteryGet().format()
} else "delay 87"

}

private setClock() { //once a day

def nowTime = new Date().time

def ageInMinutes = state.lastClockSet ? (nowTime - state.lastClockSet)/60000 : 1440

log.debug "Clock set age: ${ageInMinutes} minutes"
if (ageInMinutes >= 1440) {
    log.debug "Setting clock"
  state.lastClockSet = nowTime
    def nowCal = Calendar.getInstance(location.timeZone);
  zwave.clockV1.clockSet(hour: nowCal.get(Calendar.HOUR_OF_DAY), minute: nowCal.get(Calendar.MINUTE), weekday: nowCal.get(Calendar.DAY_OF_WEEK)).format()
} else "delay 87"

}

def setHeatingSetpoint(degrees) {

setHeatingSetpoint(degrees.toDouble())

}

def setHeatingSetpoint(Double degrees) {

log.debug “setHeatingSetpoint(${degrees})”

def p = (state.precision == null) ? 1 : state.precision

delayBetween([

  zwave.thermostatSetpointV1.thermostatSetpointSet(setpointType: 1, scale: 1, precision: p, scaledValue: degreesF).format(),
  zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 1).format(),
    "delay 2400"

])

}

def setCoolingSetpoint(degrees) {

setCoolingSetpoint(degrees.toDouble())

}

def setCoolingSetpoint(Double degrees) {

log.debug “setCoolingSetpoint(${degrees})”

def p = (state.precision == null) ? 1 : state.precision

delayBetween([

	"delay 9600",
  zwave.thermostatSetpointV1.thermostatSetpointSet(setpointType: 2, scale: 1, precision: p,  scaledValue: degrees).format(),
  zwave.thermostatSetpointV1.thermostatSetpointGet(setpointType: 2).format(),
    "delay 2400"

])

}

def configure() {

delayBetween([

  zwave.thermostatModeV2.thermostatModeSupportedGet().format(),
  zwave.thermostatFanModeV3.thermostatFanModeSupportedGet().format(),
  zwave.associationV1.associationSet(groupingIdentifier:1, nodeId:[zwaveHubNodeId]).format()

], 2300)

}

def modes() {

[“off”, “auto”, “emergencyHeat”, “heat”, “cool”]

}

def switchMode() {

def currentMode = device.currentState(“thermostatMode”)?.value

def lastTriedMode = getDataByName(“lastTriedMode”) ?: currentMode ?: “off”

def supportedModes = getDataByName(“supportedModes”)

def modeOrder = modes()

def next = { modeOrder[modeOrder.indexOf(it) + 1] ?: modeOrder[0] }

def nextMode = next(lastTriedMode)

if (supportedModes?.contains(currentMode)) {

  while (!supportedModes.contains(nextMode) && nextMode != "off") {
  	nextMode = next(nextMode)
  }

}

switchToMode(nextMode)

}

def switchToMode(nextMode) {

def supportedModes = getDataByName(“supportedModes”)

if(supportedModes && !supportedModes.contains(nextMode)) log.warn “thermostat mode ‘$nextMode’ is not supported”

if (nextMode in modes()) {

  updateState("lastTriedMode", nextMode)
  return "$nextMode"()

} else {

  log.debug("no mode method '$nextMode'")

}

}

def switchFanMode() {

def currentMode = device.currentState(“thermostatFanMode”)?.value

def lastTriedMode = getDataByName(“lastTriedFanMode”) ?: currentMode ?: “off”

def supportedModes = getDataByName(“supportedFanModes”) ?: “fanAuto fanOn”

def modeOrder = [“fanAuto”, “fanCirculate”, “fanOn”]

def next = { modeOrder[modeOrder.indexOf(it) + 1] ?: modeOrder[0] }

def nextMode = next(lastTriedMode)

while (!supportedModes?.contains(nextMode) && nextMode != “fanAuto”) {

  nextMode = next(nextMode)

}

switchToFanMode(nextMode)

}

def switchToFanMode(nextMode) {

def supportedFanModes = getDataByName(“supportedFanModes”)

if(supportedFanModes && !supportedFanModes.contains(nextMode)) log.warn “thermostat mode ‘$nextMode’ is not supported”

def returnCommand

if (nextMode == “fanAuto”) {

  returnCommand = fanAuto()

} else if (nextMode == “fanOn”) {

  returnCommand = fanOn()

} else if (nextMode == “fanCirculate”) {

  returnCommand = fanCirculate()

} else {

  log.debug("no fan mode '$nextMode'")

}

if(returnCommand) updateState(“lastTriedFanMode”, nextMode)

returnCommand

}

def getDataByName(String name) {

state[name] ?: device.getDataValue(name)

}

def getModeMap() { [

“off”: 0,

“heat”: 1,

“cool”: 2,

“emergency heat”: 4

]}

def setThermostatMode(String value) {

delayBetween([

  zwave.thermostatModeV2.thermostatModeSet(mode: modeMap[value]).format(),
  zwave.thermostatModeV2.thermostatModeGet().format()

])

}

def getFanModeMap() { [

“auto”: 0,

“on”: 1,

“circulate”: 6

]}

def setThermostatFanMode(String value) {

delayBetween([

  zwave.thermostatFanModeV3.thermostatFanModeSet(fanMode: fanModeMap[value]).format(),
  zwave.thermostatFanModeV3.thermostatFanModeGet().format()

])

}

def off() {

delayBetween([

  zwave.thermostatModeV2.thermostatModeSet(mode: 0).format(),
  zwave.thermostatModeV2.thermostatModeGet().format(),
    "delay 2400"

])

}

def heat() {

delayBetween([

  zwave.thermostatModeV2.thermostatModeSet(mode: 1).format(),
  zwave.thermostatModeV2.thermostatModeGet().format(),
    "delay 2400"

])

}

def emergencyHeat() {

delayBetween([

  zwave.thermostatModeV2.thermostatModeSet(mode: 4).format(),
  zwave.thermostatModeV2.thermostatModeGet().format(),
    "delay 2400"

])

}

def cool() {

delayBetween([

  zwave.thermostatModeV2.thermostatModeSet(mode: 2).format(),
  zwave.thermostatModeV2.thermostatModeGet().format(),
    "delay 2400"

])

}

def auto() {

delayBetween([

  zwave.thermostatModeV2.thermostatModeSet(mode: 3).format(),
  zwave.thermostatModeV2.thermostatModeGet().format(),
    "delay 2400"

])

}

def fanOn() {

delayBetween([

  zwave.thermostatFanModeV3.thermostatFanModeSet(fanMode: 1).format(),
  zwave.thermostatFanModeV3.thermostatFanModeGet().format(),
    "delay 2400"

])

}

def fanAuto() {

delayBetween([

  zwave.thermostatFanModeV3.thermostatFanModeSet(fanMode: 0).format(),
  zwave.thermostatFanModeV3.thermostatFanModeGet().format(),
    "delay 2400"

])

}

def fanCirculate() {

delayBetween([

  zwave.thermostatFanModeV3.thermostatFanModeSet(fanMode: 6).format(),
  zwave.thermostatFanModeV3.thermostatFanModeGet().format(),
    "delay 2400"

])

}

private updateResponsiveness() {

def nowTime = new Date().time
state.lastResponse = nowTime
if (device.currentValue("responsive") == null || device.currentValue("responsive") == "false") {
  log.info "Updating responsive attribute to true"
  sendEvent(name: "responsive", value: "true")
}
null

}

private checkResponsiveness() {

def nowTime = new Date().time
if (state.lastResponse) {
	def lastResponseAge = (nowTime - state.lastResponse) / 60000
  log.debug "Last response from device was received ${lastResponseAge} minutes ago"
  if (lastResponseAge >= 1440) {	//if no response was received in the last 24 hourse, set responsive to false
        if (device.currentValue("responsive") == "true") {
  		log.info "Updating responsive attribute to false"
  		sendEvent(name: "responsive", value: "false")
        }
  }
}
null

}

Numerous people have looked at this, there’s is no way to query the TRV for it’s current temp.

Note: The Danfoss radiator thermostat cannot reports its local temperature to the Z-Wave network, it only allows a one-way communication to change its setpoint.

Taken from here as an example:
http://www.vesternet.com/z-wave-danfoss-lc-13-living-connect-radiator-thermostat

@richp, any chance of a quick sanity check?

I’ve got 4 of these in action now and they’re working well. The only question I’ve got relates to manual changes of temp on the TRV itself.

If I change the temp manually on the TRV should I expect to see ST update or can the temp only be controlled from the ST environment?

Thanks

You should see it on your app if you change temp manually…

Med venlig hilsen

Danny Chris Olsen

1 Like

thanks for the quick response.

I thought this should be the case but in reality it’s not what I’m seeing. If the current temp is 22 (on the TRV and in ST) and I change the TRV to 21 then ST briefly changes to 21 before changing back to 22. All very strange. Any ideas?

The TRV does not send any information back to the ST hub, unfortunately. I have been using mine for over a year now and whenever you set temp values manually on the TRV it gets overridden during the next ST cycle.

I tried to write a handler for this about a year ago. But I had the same problem, the manual setting would always (well mostly!) get overwritten by the temperature that the device handler sends. I say mostly because the 2 events ThermostatSetpointReport & WakeUpNotification that the device sends, arrive in a seemingly random order each time. Making it difficult to figure out which temperature should be the one that is set. Is it the temperature the device sends or the one the handler has :thinking:. I couldn’t find a pattern between a scheduled wake up vs a wake up caused by manually setting the temperature at the device.

As it’s getting cold here, I’m going to take a look at this again and see if I can solve the issue. I’m hoping a year later and a little wiser to the platform that I can find a way. As my first device handler, it was the worst one to get started with. Connected ones are sooo much easier.

We’ve got some kids coming to stay on Friday, so I’ve got a deadline to get the radiators working by then. Will share what I find.

1 Like

Good luck, if you need any testing doing let me know!