Anyone using a temperature sensor other than multi ones?

Just googled SmartThings Everspring ST814 and ended up on this page – I recently switched to ST and am really happy I did. The IDE as well as this post have finally made it possible for me to fully use my Everspring ST814! Thanks for posting the solution, I’m grateful.

Finally I got this going, I followed Ben’s post and and was able to see the EverSpring ST814 but still only seen the Battery %. So I finally decided to delete the connection, and on adding a new connection, it connected, and I was able to select the EverSpring ST814. The temperature and Humidity display now but not the Battery but that is no big deal.

Thanks Ben,
Steven

Old post below:
Have you got the EverSpring ST814 to work with SmartThings? I got it connected but it only shows Battery %.

I submitted this modified version of @Ben’s app for approval back in early June but haven’t seen any movement on it. @urman had requested a driver a few months before. By the time I was able to get to it I bumped into Ben’s copy and decided to just add the features he mentioned above. I also noticed a bunch of funky behavior surrounding the parse() method and re-wrote that. I was never able to clearly identify all of the cases but the code appears to have fixed them/I worked around them (maybe one of you guys have run into these issue(s) before):

  • On initial association the parse() method was always called with the description string “updated”. In the original version this got passed to zwave.parse() and would cause it to throw an exception so I first check for that, then call zwave.parse() if needed.
  • I’m unsure what circumstances trigger it but the manual claimed support for wake-up v1 and v2 notifications so I added handlers for both to be safe.
  • As Ben mentioned, 2 types of alarms are supported via the AlarmV1 class.
    – Alarm type: 1 is a battery alarm raised by the device itself. If the alarm level is 255 alarm on, else off.
    – Alarm type: 2 w/alarm level == 1 means the device just powered on (e.g. batteries were swapped and it’s returning to service.

For the “powered up” alarm I just log it today but if a smart app needs to consume it, it’s there. For the battery alarm I actually added a tile to the device type next to the battery level tile. While battery level should be accurate, the alarm is a nice safety net as it’s raised by the device directly when it believes the battery is low (the spec didn’t state a rough percentage for when this would occur).

Reporting intervals are the same as the existing app (send temp + humidity every 5 minutes; also send if temp changes by 2deg C or humidity changes by 5%). Battery reports should come in roughly every hour. The device seems to wake up hourly as expected most of the time but sometimes it can go longer (even though temp/humidity reports are still being delivered) however I’ve never seen it go more than about 1.5hrs. I’ve had this sensor running next to a window A/C unit for about 4-5mo ~50ft from the hub and the battery has drained to about 60%… not the best but considering the update interval is so tight it’s pretty darn good. I’m sure you could get well over a year out of it simply by increasing the report interval to 15mins (I’ll likely get close to a year at 5mins).

Anyway, hope this helps someone out, and ST folks there’s a copy waiting in the “Publication Request” queue from me submitted on Jun 13th (pull request #45). Thanks,

-Chad

/**
 *  EverSpring ST814
 *
 *  Copyright 2014 Ben (SmartThings) and Chad Monroe
 *
 *  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.
 *
 */
metadata 
{
	definition (name: "EverSpring ST814", namespace: "cmonroe", author: "@Ben chad@monroe.io")
	{
		capability "Battery"
		capability "Temperature Measurement"
		capability "Relative Humidity Measurement"
		capability "Configuration"
		capability "Alarm"
		capability "Sensor"

		fingerprint deviceId: "0x2101", inClusters: "0x31,0x60,0x86,0x72,0x85,0x84,0x80,0x70,0x20,0x71"
        
        /**
		 * 0x31: COMMAND_CLASS_SENSOR_MULTILEVEL_V2
		 * 0x60: COMMAND_CLASS_MULTI_CHANNEL_V2
		 * 0x86: COMMAND_CLASS_VERSION
		 * 0x72: COMMAND_CLASS_MANUFACTURER_SPECIFIC
		 * 0x85: COMMAND_CLASS_ASSOCIATION_V2
		 * 0x84: COMMAND_CLASS_WAKE_UP_V2
		 * 0x80: COMMAND_CLASS_BATTERY
		 * 0x70: COMMAND_CLASS_CONFIGURATION_V2
		 * 0x20: COMMAND_CLASS_BASIC
		 * 0x71: COMMAND_CLASS_ALARM
         **/
	}

	simulator 
	{
		/* messages the device returns in response to commands it receives */
		for( int i = 0; i <= 100; i += 20 ) 
		{
			status "temperature ${i}F": new physicalgraph.zwave.Zwave().sensorMultilevelV2.sensorMultilevelReport(
				scaledSensorValue: i, precision: 1, sensorType: 1, scale: 1).incomingMessage()
		}

		for( int i = 0; i <= 100; i += 20 ) 
		{
			status "humidity ${i}%": new physicalgraph.zwave.Zwave().sensorMultilevelV2.sensorMultilevelReport(
				scaledSensorValue: i, precision: 0, sensorType: 5).incomingMessage()
		}

		for( int i = 0; i <= 100; i += 20 ) 
		{
			status "battery ${i}%": new physicalgraph.zwave.Zwave().batteryV1.batteryReport(
				batteryLevel: i).incomingMessage()
		}
	}

	tiles 
	{
		valueTile( "temperature", "device.temperature", inactiveLabel: false ) 
		{
			state( "temperature", label:'${currentValue}°',
				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"]
				]
			)
		}

		valueTile( "humidity", "device.humidity", inactiveLabel: false ) 
		{
			state( "humidity", label:'${currentValue}% humidity', unit:"" )
		}

		standardTile( "alarm", "device.alarm", inactiveLabel: false ) 
		{
			state( "ok", label:'BAT OK', action:'alarm.on', icon:"st.alarm.alarm.alarm", backgroundColor:"#ffffff" )
			state( "low", label:'BAT LOW', action:'alarm.off', icon:"st.alarm.alarm.alarm", backgroundColor:"#e86d13" )
		}

		valueTile( "battery", "device.battery", inactiveLabel: false, decoration: "flat" ) 
		{
			state( "battery", label:'${currentValue}% battery', unit:"" )
		}
		
		standardTile( "configure", "device.configure", inactiveLabel: false, decoration: "flat" ) 
		{
			state( "configure", label:'', action:"configuration.configure", icon:"st.secondary.configure" )
		}

		main( ["temperature", "humidity"] )
		details( ["temperature", "humidity", "alarm", "battery", "configure"] )
	}
}

/** 
 * parse incoming device messages and generate events
 **/
def parse(String description)
{
	def result = []
	def get_battery = false
	def cmd = null
    

	if ( description == "updated" )
	{
		log.debug "event description: ${description} - updating battery status"
		get_battery = true
	}
	else
	{
		cmd = zwave.parse( description, [0x20: 1, 0x31: 2, 0x70: 1, 0x71: 1, 0x80: 1, 0x84: 2, 0x85: 2] )
	}
    
	if ( cmd != null )
	{
		if ( cmd.CMD == "8407" ) 
		{
			result << zwaveEvent( cmd )

			log.debug "cmd.CMD=8407; result=${result} - updating battery status"
			get_battery = true
		}	
		else
		{
			result << createEvent( zwaveEvent( cmd ) )
		}
	}

	if( get_battery == true ) 
	{
		def last = device.currentState( "battery" )

		/* device wakes up roughly every hour */
		def age = last ? (new Date().time - last.date.time)/60000 : 10

		log.debug "Battery status was last checked ${age} minute(s) ago"

		/* don't check too often if woken up more frequently */
		if( age >= 10 ) 
		{
			log.debug "Battery status is outdated, requesting battery report"
			result << new physicalgraph.device.HubAction(zwave.batteryV1.batteryGet().format())
		}
		
		result << new physicalgraph.device.HubAction(zwave.wakeUpV1.wakeUpNoMoreInformation().format())
	}
	
	log.debug "Parse returned: ${result} for cmd=${cmd} description=${description}"
	return result
}

/**
 * event generation 
 **/
def zwaveEvent(physicalgraph.zwave.commands.wakeupv1.WakeUpNotification cmd)
{
	[descriptionText: "${device.displayName} woke up", isStateChange: false]
}

def zwaveEvent(physicalgraph.zwave.commands.wakeupv2.WakeUpNotification cmd)
{
	[descriptionText: "${device.displayName} woke up", isStateChange: false]
}

def zwaveEvent(physicalgraph.zwave.commands.alarmv1.AlarmReport cmd)
{
	def map = [:]
    
	log.debug "AlarmReport cmd: ${cmd.toString()}}"
    
    if(( cmd.alarmType == 2 ) && ( cmd.alarmLevel == 1 ))
	{
    	log.info "${device.displayName} powered up!"
        return map
 	}
	else
    {
		/* alarmType == 1 && alarmLevel == 255 means low battery, else ok */
		map.value = cmd.alarmLevel == 255 ? "low" : "ok"
		map.name = "alarm"
	}
	
	map
}

def zwaveEvent(physicalgraph.zwave.commands.sensormultilevelv2.SensorMultilevelReport cmd)
{
	log.debug "SensorMultilevelReport cmd: ${cmd.toString()}}"

	def map = [:]
	switch( cmd.sensorType ) 
	{
		case 1:
			/* temperature */
			def cmdScale = cmd.scale == 1 ? "F" : "C"
			map.value = convertTemperatureIfNeeded( cmd.scaledSensorValue, cmdScale, cmd.precision )
			map.unit = getTemperatureScale()
			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.batteryv1.BatteryReport cmd) 
{
	def map = [:]
    
	map.name = "battery"
	map.value = cmd.batteryLevel > 0 ? cmd.batteryLevel.toString() : 1
	map.unit = "%"
	map.displayed = true
    
	map
}

def zwaveEvent(physicalgraph.zwave.Command cmd) 
{
	log.debug "Catchall reached for cmd: ${cmd.toString()}"
	[:]
}

def configure() 
{
	delayBetween([
       	/* report in every 5 minute(s) */
        zwave.configurationV1.configurationSet(parameterNumber: 6, size: 2, scaledConfigurationValue: 5).format(),
    	
    	/* report a temperature change of 2 degree C */
        zwave.configurationV1.configurationSet(parameterNumber: 7, size: 1, scaledConfigurationValue: 2).format(),
        
        /* report a humidity change of 5 percent */
        zwave.configurationV1.configurationSet(parameterNumber: 8, size: 1, scaledConfigurationValue: 5).format()
	]) 
}
5 Likes

Thanks for fixing up the code @cmonroe!

New guy here. I bought a ST814 and got it working using @Ben’s code with @cmonroe edits. Thanks BTW. Is there a place I can go to track the publication status of Chad’s publication request? Just curious about the process.

This is an old thread, but I definitely recommend the US version of the “Fibaro Z-Wave FGK-101 Temperature & Door/Window Sensor” which is very small and very accurate. The only drawback is that it is presently only partially supported by SmartThings, and to fully benefit of it you need a custom handler.
But you are in luck : I did one which works fine and can be found there :smile: :

thanks ben and chad for your hard work. Code works great!

Worked like a charm. Fantastic, thanks to both of you.

Yes… Fibaros motions with temp, vibration, lux and motion.

@smart Is there really a big eyeball staring at you on this Fibaros device? I am trying to be more inconspicuous, the eyeball seems like it would freak the hell out of somebody thinking big brother was watching them. Thanks.

What can I say? I have no intention of getting rid of the flashes or blinks! It reminds me as I have stated earlier that something in my setup actually works… :wink: Also will give any intruder a feeling that he has been recorded. :wink:

1 Like

@krv, it’s not as bad as it sounds. It is a very brief flash and it doesn’t look like an eyeball unless you stare right at it when it flashes and use a little imagination. :smile: The form factor, however, is one of the best out there, though. Very compact with a great and extremely simple mount. I like the mount better than the Aeon since it is much smaller.

I’m pretty certain you can dim if via some settings, but they are not part of the integration yet. @wackware, who did an awesome job putting together several Fibaro device types, is working on a settings app that will allow the tweaks. If you look at the Fibaro manual, there are A LOT of options. I don’t know of another sensor off the top of my hear which has that many settings options.

When budget allows, I plan on picking up a few more.

Can anyone speak on the accuracy, in particular humidity, readings of the ST814? I have a several valuable guitars that I keep in a humidity controlled room. I also have several non-wifi/z-wave RH gauges that are very accurate (within +/- 1%) but have never found any remote accessible gauges that match that accuracy. Having a gauge read 42% when the actual % is 36 is totally unacceptable. When I am away from home I would like to be able to check up on the humidity level in this room and feel assured the reading is within acceptable tolerance (+/- 2%)

This works great for me! Thanks!!

I ran tests over the last four months using Calibrated Laboratory Tube Type Thermometers as a reference and found that most temperature sensors including the Multi-sensors were off, some as much as 10 degrees Fahrenheit, except for the SmartSense Temp/Humidity, Wireless ZigBee Sensors. If you only want an idea of what the temperature is then most will give you a close enough estimate. My reason to be a little paranoid is that back in January 2012 I arrived up at my second home located up at 8,000’ in the Rockies to find that my near new 2 stage Trane Central Heating Furnace had failed and that my three toilets had approximately 1/2" of ice in each and that most of my Water Filters and some plumbing had frozen solid resulting in quite a few thousands of dollars of damage. I was lucky on two accounts as I always turn my well pump off before leaving my house to leave to my other home in the SF Bay Area of CA so no flooding as what happened to SmartThings CEO Alex Hawkinson’s Rocky Mountain home, and I was capable of rebuilding my furnace, replacing all my filters, and repairing all my plumbing. The temperatures at my second home in the Rockies gets down to minus 25 degrees Fahrenheit or colder. I now have pre-positioned oil filled radiators that when the temperature in my Water Filters Alcove drops below 34 degrees Fahrenheit my SmartSense Temp/Humidity, Wireless ZigBee Sensor sends a signal to my Aeon Labs DSC06106-ZWUS, Z-Wave Smart Energy Switch which turns on my first heater. I have a second backup heater system turn on in case the first fails. I’m also notified of the temps and failures on my smart phone. Most people think that freezing water breaks pipes at 32 degrees Fahrenheit but actually at about 39.2 degrees Fahrenheit (4°C) water reaches maximum density (expansion) and then decreases in density as it approaches the freezing point. The above is why I’m paranoid and why I got involved in Home Automation!

1 Like

Edit: Self Answered.
I had a little feeling that my ST814 was still included in an old network, and by going into the ST Zwave utilities, was able to exclude it.
It was then deteced as a general ZWave sensor, and then I could change the device type to ST814 and following the rest of the instructions, works well.

All, @Ben, @cmonroe, sorry for dragging this up - I actually got my ST from Kickstarter, and only just got round to configuring (Doh!) but have done so now successfully.

However, I havent yet read the developer docs…and I want to add my ST814, which I can see can be done.

Ive copied the code into the IDE in My Device Types, and published for ME.
in My Devices, Ive added the ST814, and was asked for a network ID, so I put ‘1’ in, as I couldnt find a hex/other string on the device (and Im guessing that’s where the problem is).

The device has appeared on my ST Dashboard Things on my ANdroid phone, but the Configure button doesnt react (despite following the remove batteries etc instructions)

Any thoughts?
TIA

Thank you guys for the device driver! I just installed my ST814, works perfectly. You are awesome :slight_smile:

@cmonroe thank you very much for the code for this device. We recently had our freezer have a malfunction and lost all of our food. Never again after reading many product reviews this one seems to be the most likely to live in a freezer so now that I just got it in the mail today and have it working thanks to your awesome code I’m off to go stick it in my freezer and see how it does :smile:

Wow, I’m surprised this isn’t in the driver database yet. Glad that it’s helping folks out either way! One thing to watch out for using this in an enclosed space (like a freezer) is that signal is strong enough. I have some water sensors under the kitchen sink that sometimes only communicate when the door is open. With the ST814 you’ll know quickly if you watch the activity log on your phone as you should see temp reports every 5 mins and humidity reports on change. If you close the lid and stop getting updates alerts won’t work of course… just something to watch out for :smile:

If any ST folks are reading this thread I submitted this driver for inclusion over a year ago; timestamp 13 Jun 2014 10:24 AM UTC pull request #45. Thanks!

1 Like

Hi All,
Looking to monitor my fridge temp). On Amazon, I see the EverSpring ST814 and the EverSpring ST814-2 available. The ST814-2 is currently a few $ less, so I wanted to see if anyone has successfully used it with SmartThings - I’d like to assume that the ST814-2 would work with ST using the code from cmonroe, but we all know what happens when you assume. Thanks in advance!