Anyone using a temperature sensor other than multi ones?

Works perfectly @ben! Thanks a ton!

Glad it works for you! Now I have the z-wave alternative of polling for temp/humidity from my Nest!

I believe the only thing this device type doesn’t work with is the ALARM_CLASS that this device supports. It looks like it will report when a battery is inserted into the device as well as an alarm when the battery is low. I should clean up some of my comments/notes and debug statements.

I noticed I have an extra capability in there…I think. I’m not sure what the “Sensor” capability does.

I created a custom device type based on the above and changed my sensor’s device type to the newly crerated one. I stil get nothing on my smartthings.

Please also do the following, after the device type is installed.

-Remove the batteries from the ST814 for about 20-30 seconds
-Reinsert the batteries
-Immediately go to your iOS or Android device open the SmartThings app
-Go to the “Things” view and find your ST814, click the gear icon
-Tap on the “Configure” button

Since this a battery device, it only “wakes up” every once in a while - removing and inserting the batteries makes sure its awake. If you happen to have installed the device type when it was asleep, it didn’t receive the configuration commands needed to have it report back the temperature and humidity every once in a while.

1 Like

I am not sure what i have. ST814 shows up in my smartthings:

Name SmartSense Moisture
Label Master Bedroom Humidity
Type EverSpring ST814
Version Published
Device Network Id 2D
Status ACTIVE
Hub ZZZZ
Last Activity At 25 Apr 2014 09:15:48
Date Created 18 Apr 2014 20:05:00
Last Updated 25 Apr 2014 09:16:03
Data [endpointId:0]
Raw Description 0 0 0x2101 0 0 0 a 0x31 0x60 0x86 0x72 0x85 0x84 0x80 0x70 0x20 0x71
Current States battery: 100 %

BUt the app shows “configure” that I cannot access, and I do not see a temperature or humidity, simply two circles, blue and white. What am I doing wrong?

In the IDE click “My Device Types” then “New SmartDevice.” In the “Name” field type “Everspring ST814” and then click “Create” at the bottom.

That will take you to the code page. Delete everything in there and paste in Ben’s code from above. Save and Publish that.

Now got back to “My Devices” and click your “Master Bedroom Humidity” device. Click Edit at the bottom and change the device type to Everspring ST814. Click Update.

Now remove the batteries from your ST814 and put them back in. Once the device has started up push the configure button for that device in the SmartThings app on your phone.

1 Like

I did everything except removing the batteries. Will do the batteries trick, will see ehat happens.

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%)