Ecolink Zwave plus flood & freeze sensor

Anyone try and pair the new Ecolink Zwave plus flood & freeze sensor to the hub. Just wondering if it will need a custom device handler.

1 Like

Works fine with SmartThings, paired up easily. Discovered as a “Z-Wave Door/Window Sensor” and had to go edit the device in the IDE to “Z-Wave Water Sensor”. If you can handle doing that it’s a good piece of hardware. The prongs are shorter and larger in diameter than what’s reflected in the photos.

It originally paired as an open/close door sensor with the default set to closed. When you switched the IDE did you also get a temperature reading?

After trying every device type that had anything to do with water/moisture, none of them worked as both a water and temperature sensor. The water sensor worked on a number of device types but none of them worked as a temperature sensor. Hopefully, someone can create a custom device type/handler to make this sensor work as intended. Right now the “Z-wave water sensor” device type works for just water and is a good option for Z-wave environments. The device is very small, well constructed and the CR123A lithium battery coupled with Z-wave plus should give us 5 years of battery life.

I’ll send it our team to take a crack at it. Can you PM me the raw description for your device.

Here’s what I have so far. It still does not work, but it must be close.

/**
 *  Copyright 2017 Big Pine Systems
 *  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.
 *
 *  Ecolink Flood Freeze Sensor
 *
 *  Author: Keith Ballantyne
 *  Date: 2017-11-28
 */

metadata {
definition (name: "EcoLink Flood/Freeze Sensor", namespace: "bigpinesystems", author: "Keith Ballantyne", ocfDeviceType: "x.com.st.d.sensor.water") {
	capability "Water Sensor"
	capability "Sensor"
	capability "Battery"
    capability "Temperature Measurement"

	fingerprint mfr: "014A", prod: "0005", model: "0010"
}

simulator {
    status "dry": "command: 3006, payload: 00"
    status "wet": "command: 3006, payload: FF"
    status "freezing": "command: 3007, payload: FF"
    status "normal": "command: 3007, payload: 00"
	status "dry notification": "command: 7105, payload: 04"
	status "wet notification": "command: 7105, payload: 02"
	status "wake up": "command: 8407, payload: "
}

tiles(scale:2) {
	multiAttributeTile(name:"water", type: "generic", width: 3, height: 4){
		tileAttribute("device.water", key: "PRIMARY_CONTROL") {
			attributeState("dry", icon:"st.alarm.water.dry", backgroundColor:"#ffffff")
			attributeState("wet", icon:"st.alarm.water.wet", backgroundColor:"#00A0DC")
		}
	}
    multiAttributeTile(name:"temperature", type: "generic", width: 3, height: 4){
    	tileAttribute ("device.temperature", key: "PRIMARY_CONTROL") {
        	attributeState("freezing", icon: "st.Weather.weather7", backgroundColor:"#0000ff")
        	attributeState("normal", icon: "st.Weather.weather2", backgroundColor:"#ffffff")
    	}
    }
	valueTile("battery", "device.battery", inactiveLabel: false, decoration: "flat", width: 2, height: 2) {
		state "battery", label:'${currentValue}% battery', unit:""
	}

	main (["water", "temperature"])
	details(["water", "temperature", "battery"])
}
}

private getCommandClassVersions() {
[0x20: 1, 0x30: 2, 0x31: 5, 0x80: 1, 0x84: 1, 0x71: 3, 0x9C: 1]
}

def parse(String description) {
    def result = null
    def cmd = zwave.parse(description, getCommandClassVersions())
    if (cmd) {
            result = zwaveEvent(cmd)
            log.debug "Parsed ${cmd} to ${result.inspect()}"
    } else {
            log.debug "Non-parsed event: ${description}"
    }
    result
}


def zwaveEvent(physicalgraph.zwave.commands.sensorbinaryv2.SensorBinaryReport cmd) {
    def result
    switch (cmd.sensorType) {
            case 6:
                    result = createEvent(name:"water",
                            value: cmd.sensorValue ? "wet" : "dry")
                    break
            case 7:
                    result = createEvent(name:"temperature",
                            value: cmd.sensorValue ? "freezing" : "normal")
                    break
    }
    result
}



def zwaveEvent(physicalgraph.zwave.commands.notificationv3.NotificationReport cmd)
{
def result = []
if (cmd.notificationType == 0x05) {
	switch (cmd.event) {
	case 0x04:
		result << createEvent(descriptionText: "Water alarm cleared", isStateChange: true)
		break
	case 0x02:
		result << createEvent(descriptionText: "Water alarm ACTIVE", isStateChange: true)
		break
	}
} else if (cmd.notificationType == 0x07) {
	switch(cmd.event) {
    	case 0x03: 
			result << createEvent(descriptionText: "$device.displayName covering was removed", isStateChange: true)
			result << response([
				zwave.wakeUpV1.wakeUpIntervalSet(seconds:4*3600, nodeid:zwaveHubNodeId).format(),
				zwave.batteryV1.batteryGet().format()])
            break;
        case 0x00:
			result << createEvent(descriptionText: "$device.displayName covering was replaced", isStateChange: true)
			result << response([
				zwave.wakeUpV1.wakeUpIntervalSet(seconds:4*3600, nodeid:zwaveHubNodeId).format(),
				zwave.batteryV1.batteryGet().format()])
            break;
    }
} else if (cmd.notificationType == 0x08) {
	switch (cmd.event) {
    	case 0x0A:
			result << createEvent(descriptionText: "$device.displayName replace battery soon", isStateChange: true)
			result << response([
				zwave.wakeUpV1.wakeUpIntervalSet(seconds:4*3600, nodeid:zwaveHubNodeId).format(),
				zwave.batteryV1.batteryGet().format()])
            break;
        case 0x0B:
			result << createEvent(descriptionText: "$device.displayName replace battery NOW", isStateChange: true)
			result << response([
				zwave.wakeUpV1.wakeUpIntervalSet(seconds:4*3600, nodeid:zwaveHubNodeId).format(),
				zwave.batteryV1.batteryGet().format()])
            break;
	}
} else if (cmd.notificationType) {
	def text = "Notification $cmd.notificationType: event ${([cmd.event] + cmd.eventParameter).join(", ")}"
	result << createEvent(name: "notification$cmd.notificationType", value: "$cmd.event", descriptionText: text, displayed: false)
} else {
	def value = cmd.v1AlarmLevel == 255 ? "active" : cmd.v1AlarmLevel ?: "inactive"
	result << createEvent(name: "alarm $cmd.v1AlarmType", value: value, displayed: false)
}
result
}

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

    // Only ask for battery if we haven't had a BatteryReport in a while
    if (!state.lastbatt || (new Date().time) - state.lastbatt > 24*60*60*1000) {
            result << response(zwave.batteryV1.batteryGet())
            result << response("delay 1200")  // leave time for device to respond to batteryGet
    }
    result << response(zwave.wakeUpV1.wakeUpNoMoreInformation())
    result
}

def zwaveEvent(physicalgraph.zwave.commands.batteryv1.BatteryReport cmd) {
    def map = [ name: "battery", unit: "%" ]
    if (cmd.batteryLevel == 0xFF) {  // Special value for low battery alert
            map.value = 1
            map.descriptionText = "${device.displayName} has a low battery"
            map.isStateChange = true
    } else {
            map.value = cmd.batteryLevel
    }
    // Store time of last battery update so we don't ask every wakeup, see WakeUpNotification handler
    state.lastbatt = new Date().time
    createEvent(map)
}


def zwaveEvent(physicalgraph.zwave.commands.manufacturerspecificv2.ManufacturerSpecificReport cmd) {
def result = []

def msr = String.format("%04X-%04X-%04X", cmd.manufacturerId, cmd.productTypeId, cmd.productId)
log.debug "msr: $msr"
updateDataValue("MSR", msr)

if (msr == "0086-0002-002D") {  // Aeon Water Sensor needs to have wakeup interval set
	result << response(zwave.wakeUpV1.wakeUpIntervalSet(seconds:4*3600, nodeid:zwaveHubNodeId))
}
result << createEvent(descriptionText: "$device.displayName MSR: $msr", isStateChange: false)
result
}

Almost there. I wish I could help but my coding capabilities are infantile.

The “SmartSense Moisture Sensor” device type came the closest to having all the capabilities without having a working temperature if that helps at all.

I am continuing to work on it. It’s still not working right, but the UI looks closer now.

If anybody has ideas on:

  1. Why logging doesn’t seem to work.
  2. Why refresh doesn’t seem to do anything?
  3. Whether the fingerprint needs to contain more.

Paulo,

If you have a chance, I would love to hear feedback on whether the latest version in GitHub works for your device. Mine is about 200 miles away at my cabin, so I cannot play with it locally and ensure the code is working.

Thanks,

Keith

Unfortunately, mine is also in a vacation home and I can’t physically test the hardware until the holidays. I will update the code to see your progress but I’m sure you have already done that on your end. Sorry, I wish could be more helpful.

Paulo

Rboy has developed a device handler that works and is available on his website.

2 Likes

Here is the release page

Looks like you are down the road on this, specifically the temperature. I was only worried about the flood part so I didn’t even notice the lack of full functionality.

I’ve tested the latest version of mine and confirmed it is working for all three (tamper, freeze, flood). It can be found on the github page mentioned above.

I purchased 3 ecolink Flood/Freeze Units Model FLF-zwave5 units. I installed them and each showed the temperature, flood, battery and tamper indicators on the UI. I renamed them and they went to purely flood indications on the UI. I could not get them to go back to the UI where all of the values were shown.

When I purchased these I did not see were it was necessary that I purchase a Handler to support these units and not for the cost of one of the units.

We have 50 plus devices on our system. Does this Handler do something else to improve the system or process

If you are asking “Do they act as Z-wave repeaters with the new device handler?”, the answer is no.