Anyone try/have a Philio PSM01 Z-Wave Multi-sensor?

I did a search and came up empty, but since some ST folks also have/had a Vera controller, perhaps someone has one working with ST? Here’s more info:

http://www.tigerdirect.com/applications/SearchTools/item-details.asp?EdpNo=8686380&CatId=7191

This device (ZWave) detects door/window opening, ambient light, ambient temperature, but more expensive than ST’s multi (Zigbee).

I bought one tonight and got it working just the way I like it. I put together my own device type since it was not detected properly. It was found as a Aeon Multisensor. Here’s the device type code in case anyone else gets one:

/**
 *  Philio PSM01 Z-Wave Multi-sensor. Detects door/window opening, ambient light, ambient temperature
 *
 *  Capabilities to enable: battery, contact, illuminace, temperature, poll, refresh, sensor
 *
 *  Author: SmartThings, jscgs350
 *  Date: 2013-11-3, 2014-3-12
 */

// for the UI
metadata {
	simulator {

		status "open"	: "command: 3003, payload: FF"
		status "closed"	: "command: 3003, payload: 00"

		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 "luminance ${i} lux": new physicalgraph.zwave.Zwave().sensorMultilevelV2.sensorMultilevelReport(
				scaledSensorValue: i, precision: 0, sensorType: 3).incomingMessage()
		}
		for (int i = 200; i <= 1000; i += 200) {
			status "luminance ${i} lux": new physicalgraph.zwave.Zwave().sensorMultilevelV2.sensorMultilevelReport(
				scaledSensorValue: i, precision: 0, sensorType: 3).incomingMessage()
		}

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

	tiles {
		standardTile("contact", "device.contact", width: 2, height: 2) {
			state "open", label: 'YOURDOORNAMEHERE\n${name}', icon: "st.contact.contact.open", backgroundColor: "#ffa81e"
			state "closed", label: 'YOURDOORNAMEHERE\n${name}', icon: "st.contact.contact.closed", backgroundColor: "#79b821"
		}
		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("illuminance", "device.illuminance", inactiveLabel: false) {
			state "luminosity", label:'${currentValue} ${unit}', unit:"lux"
		}
		valueTile("battery", "device.battery", inactiveLabel: false, decoration: "flat") {
			state "battery", label:'${currentValue}% battery', unit:""
		}
		standardTile("refresh", "device.switch", inactiveLabel: false, decoration: "flat") {
			state "default", label:'', action:"refresh.refresh", icon:"st.secondary.refresh"
		}        

		main(["contact", "temperature", "illuminance"])
		details(["contact", "temperature", "illuminance", "battery", "refresh"])
	}
}

// Parse incoming device messages to generate events
def parse(String description)
{
	def result = []
	def cmd = zwave.parse(description, [0x31: 2, 0x30: 1, 0x84: 1, 0x20: 1, 0x70: 1, 0x80: 1, 0x01: 1])
	if (cmd) {
		if( cmd.CMD == "8407" ) { result << new physicalgraph.device.HubAction(zwave.wakeUpV1.wakeUpNoMoreInformation().format()) }
		result << createEvent(zwaveEvent(cmd))
	}
	log.debug "Parse returned ${result}"
	return result
}

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

def zwaveEvent(physicalgraph.zwave.commands.sensormultilevelv2.SensorMultilevelReport cmd)
{
	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 3:
			// luminance
			map.value = cmd.scaledSensorValue.toInteger().toString()
			map.unit = "lux"
			map.name = "illuminance"
			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 = false
	map
}

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

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

def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicSet cmd)
{
	sensorValueEvent(cmd.value)
}

def zwaveEvent(physicalgraph.zwave.commands.switchbinaryv1.SwitchBinaryReport cmd)
{
	sensorValueEvent(cmd.value)
}

def zwaveEvent(physicalgraph.zwave.commands.sensorbinaryv1.SensorBinaryReport cmd)
{
	sensorValueEvent(cmd.sensorValue)
}

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

@JSCGS350 I also brought this from TigerDirect Philio PSM01 Z-Wave Multi-sensor Can you share with me how you made a new device? Thanks

@llcanada, no problem:

  1. Go to http://ide.smartthings.com

If you don’t have a developer account, register for one and then log in.

  1. Once logged in, click on “My Device Types”, and then click on the “+New SmartDevice” button that’s off to the far right.

  2. On the next screen that comes up just put in “Philio PSM01 Z-Wave Multi-sensor” for Name (or anything you want), scroll all the way down and click on the “Create” button. You’ll be able to change the name again later.

  3. In the next screen that comes up, delete all the code that you see, and paste the code below, change the name (line that says “definition” to anything you want - mine is for the crawl space door sensor), change the “standardTile” label to what ever you want - mine is Crawl Space, click on the “Save” button, and then click on “Publish --> For Me”. Step 5 is next:

    /**

    • Philio PSM01 Z-Wave Multi-sensor. Detects door/window opening, ambient light, ambient temperature
    • Capabilities to enable: battery, contact, illuminace, temperature, poll, refresh, sensor
    • Author: SmartThings, jscgs350
    • Date: 2013-11-3, 2014-3-12
      **/
      // for the UI
      metadata {
      // Automatically generated. Make future change here.
      definition (name: "Crawl Space Door Sensor", author: "jsconst@gmail.com") {
      capability "Contact Sensor"
      capability "Temperature Measurement"
      capability "Sensor"
      capability "Illuminance Measurement"
      capability "Battery"
      capability "Refresh"
      capability "Polling"
      }

    simulator {

     status "open"	: "command: 3003, payload: FF"
     status "closed"	: "command: 3003, payload: 00"
    
     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 "luminance ${i} lux": new physicalgraph.zwave.Zwave().sensorMultilevelV2.sensorMultilevelReport(
     		scaledSensorValue: i, precision: 0, sensorType: 3).incomingMessage()
     }
     for (int i = 200; i <= 1000; i += 200) {
     	status "luminance ${i} lux": new physicalgraph.zwave.Zwave().sensorMultilevelV2.sensorMultilevelReport(
     		scaledSensorValue: i, precision: 0, sensorType: 3).incomingMessage()
     }
    
     for (int i = 0; i <= 100; i += 20) {
     	status "battery ${i}%": new physicalgraph.zwave.Zwave().batteryV1.batteryReport(
     		batteryLevel: i).incomingMessage()
     }
    

    }

    tiles {
    standardTile("contact", "device.contact", width: 2, height: 2) {
    state "open", label: 'Crawl Space\nDoor\n${name}', icon: "st.contact.contact.open", backgroundColor: "#ffa81e"
    state "closed", label: 'Crawl Space\nDoor\n${name}', icon: "st.contact.contact.closed", backgroundColor: "#79b821"
    }
    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("illuminance", "device.illuminance", inactiveLabel: false) {
    state "luminosity", label:'${currentValue} ${unit}', unit:"lux"
    }
    valueTile("battery", "device.battery", inactiveLabel: false, decoration: "flat") {
    state "battery", label:'${currentValue}% battery', unit:""
    }
    standardTile("refresh", "device.switch", inactiveLabel: false, decoration: "flat") {
    state "default", label:'', action:"refresh.refresh", icon:"st.secondary.refresh"
    }

     main(["contact", "temperature", "illuminance"])
     details(["contact", "temperature", "illuminance", "battery", "refresh"])
    

    }
    }

    // Parse incoming device messages to generate events
    def parse(String description)
    {
    def result = []
    def cmd = zwave.parse(description, [0x31: 2, 0x30: 1, 0x84: 1, 0x20: 1, 0x70: 1, 0x80: 1, 0x01: 1])
    if (cmd) {
    if( cmd.CMD == "8407" ) { result << new physicalgraph.device.HubAction(zwave.wakeUpV1.wakeUpNoMoreInformation().format()) }
    result << createEvent(zwaveEvent(cmd))
    }
    log.debug "Parse returned ${result}"
    return result
    }

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

    def zwaveEvent(physicalgraph.zwave.commands.sensormultilevelv2.SensorMultilevelReport cmd)
    {
    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 3:
    // luminance
    map.value = cmd.scaledSensorValue.toInteger().toString()
    map.unit = "lux"
    map.name = "illuminance"
    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 = false
    map
    }

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

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

    def zwaveEvent(physicalgraph.zwave.commands.basicv1.BasicSet cmd)
    {
    sensorValueEvent(cmd.value)
    }

    def zwaveEvent(physicalgraph.zwave.commands.switchbinaryv1.SwitchBinaryReport cmd)
    {
    sensorValueEvent(cmd.value)
    }

    def zwaveEvent(physicalgraph.zwave.commands.sensorbinaryv1.SensorBinaryReport cmd)
    {
    sensorValueEvent(cmd.sensorValue)
    }

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

  4. Now click on “My Devices”

  5. Click on the device that ST initially found when you included it to your hub. I think it was called Aeon multi sensor or something like that if I remember right.

  6. Scroll down and click on “Edit”, in the field that says “Type *” select the device type you just created in step 4.

  7. Scroll all the way down and click on “Update” and that’s it!

Now force close your app on your device, or you can log off and log back in (I found that works too). The device tile in the ST app should now be updated.

1 Like

@JSCGS350 I want to thank you for your time and your teaching skills. Thanks

No problem, glad to help.

Nice job. How accurate does the temperature sensor seem to be?

@coryds, thanks! I’m actually very pleased with the accuracy so far. I have 3 of these Things - 2 refrigerators and our crawl space.

Since I also use them for open/close sensors and they’re close to potential outside air infiltration, I have to take that into account.

If I didn’t care about open/close, I’d probably put the sensors for the frigs in the back about halfway down. On one frig I have the sensor halfway down towards the front on the side where it clears any door shelving when closed and where the magnet will still trip them. It’s about 3-4 degrees different than what the display on the frig says.

The other frig has double frig doors on top, so I have the sensor mounted all the way down on one door with the magnet on that “flap” that seals the jam when both doors are closed. That way when either door is opened the sensor will trip. It’s about 1-3 degrees different than what the frig’s display says.

Using each sensor without the need for open/close, I almost always saw the same temp as what the frig’s display had.

The crawl space sensor is on an un-insulated thin outside door, and it’s subject to the sun at times, but surprisingly I’ve only seen around 5 degrees difference from a “real” thermometer about 10 feet away. That’s acceptable for me.

Nice. Do you have a ST multi to compare it against? Mine are always off by 5-7 degrees in either direction.

I have 2, but I’ve not used them for temperature just primarily for open/close. Since the Philio sensors are available at Tiger Direct, I could easily swing by and buy these vs online; plus I’m trying to stick with Zwave devices as much as possible.

I’m also seeing the same as you regarding temperature because both of mine are in areas where there are other thermometers.

@JSCGS350 are you having any battery problems, as I had to change my battery again. This is the third time. Is there something that I can change cause it suppose to last at least a year or so. Thanks.

@llcanada, Mine are still in 80%+. Do you have yours in areas where there’s a lot of usage? Seems odd that you’ve had to replace batteries that quick.

Check you logs (device events) and see how frequently they’s communicating (waking up) back to ST, or how often they’re polled. Perhaps excluding and re-including them could be the trick.

hey all! I seem to be having trouble with this… it appears now as an unknown device… plus it says it’s open when it’s not… and a bunch of other things… ok, I’m not home, I’m checking this out from the office… what can I try? Shall I wait till I get home?

Damn, had it working for a while although not completely… but now I don’t know what the heck I did I can’t seem to get it to work… :frowning:

I only copied the code from above but seem to have trouble @ line 22… haven’t modified anything else…

I get this error:

"org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
script1415376786408890626542.groovy: 22: unexpected token: : @ line 22, column 26.
status “open” : “command: 3003, payload: FF”
^

1 error"