Aeon Multisensor 6 - Motion Issues?

It's a battery limitation! Here's Aeon's Engineering spec on the value:

The interval time of sending reports in Report group 1 (Valid values 0x05-0x28DE80).

  1. The unit of interval time is second if USB power.
  2. If battery power, the minimum interval time is 60 minutes by default, for example, if the value is set to be more than 5 and less than 3600, the interval time is 60 minutes, if the value is set to be more than 3600 and less than 7200, the interval time is 120 minutes. You can also change the minimum interval time to 4 minutes via setting the interval value(3 bytes) to 240 in Wake Up Interval Set CC.

I am taking a look at these and want to purchase one to play with. What are you using for a driver? I noticed that the Dome motion isn't listed in the compatible devices wiki. Also, does it allow you to adjust the motion timing?

Thanks

What is the coverage like in the ceiling recessor? I have one taped to a wall in my master bathroom but I am thinking about putting it in the ceiling

I was looking around to find the angle of view on the device - but apparently my google-fu is failing :frowning:

Im not sure what its angle specs are, but they seem to have good coverage. Even with 12 foot ceilings. One covers my kitchen very well, and even picks up motion from the family room sometimes.

1 Like

So using the "Advanced" driver ... if I select "Selective Reporting" so that it only reports (in theory) based on thresholds for the non-motion sensors, does the "Reporting Interval" override this?

e.g.: Reporting interval 5m and nothing changes to force a Selective Threshold does it wake up and report or does it ignore the interval if Selective Reporting is enabled?

I have a few of these, one USB powered (in home office) and others that will be recess mounted and battery powered - trying to find the right balance for battery lovin' longevity (or I better buy stock in a battery company LOL)

There's a ST DH that's been converted, and works reasonably well.

/**
 *  HUBITAT: Dome Motion Sensor v1.0
 *  (Model: DMMS1)
 *
 *  Author: 
 *    Kevin LaFramboise (krlaframboise)
 *
 *  Changelog:
 *
 *    1.0 (02/10/2018)
 *      - Initial Release
 *
 *
 *  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: "Dome Motion Sensor", 
		namespace: "krlaframboise", 
		author: "Kevin LaFramboise"
	) {
		capability "Sensor"
		capability "Motion Sensor"
		capability "Illuminance Measurement"
		capability "Battery"
		capability "Configuration"
		capability "Refresh"
		capability "Health Check"
		
		attribute "lastCheckin", "string"
		
		fingerprint deviceId: "0x0701", inClusters: "0x30, 0x31, 0x59, 0x5A, 0x5E, 0x70, 0x71, 0x72, 0x73, 0x80, 0x84, 0x85, 0x86"
		
		fingerprint mfr:"021F", prod:"0003", model:"0083"
	}
	
	preferences {
		input "ledEnabled", "enum",
			title: "Enable/Disable LED:",
			defaultValue: ledEnabledSetting,
			required: false,
			displayDuringSetup: true,
			options: ledEnabledOptions.collect { it.name }
		input "motionEnabled", "enum",
			title: "Enable/Disable Motion:",
			defaultValue: motionEnabledSetting,
			required: false,
			displayDuringSetup: true,
			options: motionEnabledOptions.collect { it.name }
		input "motionClearedDelay", "enum",
			title: "Motion Cleared Delay:",
			defaultValue: motionClearedDelaySetting,
			required: false,
			displayDuringSetup: true,
			options: motionClearedDelayOptions.collect { it.name }
		input "motionRetrigger", "enum",
			title: "Motion Retrigger Interval:",
			defaultValue: motionRetriggerSetting,
			required: false,
			displayDuringSetup: true,
			options: motionRetriggerOptions.collect { it.name }
		input "motionSensitivity", "enum",
			title: "Motion Detection Sensitivity:",
			defaultValue: motionSensitivitySetting,
			required: false,
			displayDuringSetup: true,
			options: motionSensitivityOptions.collect { it.name }
		input "lightReporting", "enum",
			title: "Light Reporting Interval:",
			defaultValue: lightReportingSetting,
			required: false,
			displayDuringSetup: true,
			options: lightReportingOptions.collect { it.name }
		input "lightSensitivity", "enum",
			title: "Light Reporting Sensitivity:",
			defaultValue: lightSensitivitySetting,
			required: false,
			displayDuringSetup: true,
			options: lightSensitivityOptions.collect { it.name }
		input "wakeUpInterval", "enum",
			title: "Checkin Interval:",
			defaultValue: checkinIntervalSetting,
			required: false,
			displayDuringSetup: true,
			options: checkinIntervalOptions.collect { it.name }
		input "batteryReportingInterval", "enum",
			title: "Battery Reporting Interval:",
			defaultValue: batteryReportingIntervalSetting,
			required: false,
			displayDuringSetup: true,
			options: checkinIntervalOptions.collect { it.name }
		input "debugOutput", "bool", 
			title: "Enable debug logging?", 
			defaultValue: true, 
			required: false
	}

}

// Sets flag so that configuration is updated the next time it wakes up.
def updated() {	
	// This method always gets called twice when preferences are saved.
	if (!isDuplicateCommand(state.lastUpdated, 3000)) {		
		state.lastUpdated = new Date().time
		logTrace("updated()")

		logForceWakeupMessage "The configuration will be updated the next time the device wakes up."
	}		
}

// Initializes the device state when paired and updates the device's configuration.
def configure() {
	logTrace("configure()")
	def cmds = []
	def refreshAll = (!state.isConfigured || !settings?.ledEnabled)
	
	if (!state.isConfigured) {
		logTrace("Waiting 1 second because this is the first time being configured")
		sendEvent(getEventMap("motion", "inactive", false))
		sendEvent(getEventMap("illuminance", 0, false, null, "lx"))
		cmds << "delay 1000"
	}
	
	configData.sort { it.paramNum }.each { 
		cmds += updateConfigVal(it.paramNum, it.size, it.value, refreshAll)	
	}
		
	if (refreshAll || (checkinIntervalSettingMinutes * 60) != state.checkinInterval) {
		cmds << wakeUpIntervalSetCmd(checkinIntervalSettingMinutes)
		cmds << wakeUpIntervalGetCmd()
	}
	
	if (cmds) {
		logDebug("Sending configuration to device.")
	}
		
	if (state.pendingRefresh || canReportBattery()) {
		cmds << batteryGetCmd()
	}
	
	return cmds ? delayBetween(cmds, 1000) : []
}

private updateConfigVal(paramNum, paramSize, val, refreshAll) {
	def result = []
	def configVal = state["configVal${paramNum}"]
	
	if (refreshAll || (configVal != val)) {
		logDebug "#${paramNum}: changing ${configVal} to ${val}"
		result << configSetCmd(paramNum, paramSize, val)
		result << configGetCmd(paramNum)
	}	
	return result
}

private initializeCheckin() {
	// Set the Health Check interval so that it can be skipped once plus 2 minutes.
	def checkInterval = ((checkinIntervalSettingMinutes * 2 * 60) + (2 * 60))
	
	sendEvent(name: "checkInterval", value: checkInterval, displayed: false, data: [protocol: "zwave", hubHardwareId: device.hub.hardwareID])
}

// Required for HealthCheck Capability, but doesn't actually do anything because this device sleeps.
def ping() {
	logDebug("ping()")
}

// Forces the configuration to be resent to the device the next time it wakes up.
def refresh() {	
	if (state.pendingRefresh) {
		logForceWakeupMessage "All settings will be sent to the device the next time it wakes up."
		configData.each {
			state."configVal${it.paramNum}" = null
		}
	}
	else {
		logForceWakeupMessage "The sensor data will be refreshed the next time the device wakes up."
		state.pendingRefresh = true
	}
}

private logForceWakeupMessage(msg) {
	logDebug("${msg}  You can force the device to wake up immediately by pressing the connect button once.")
}

// Processes messages received from device.
def parse(String description) {
	def result = []
	
	sendEvent(name: "lastCheckin", value: convertToLocalTimeString(new Date()), displayed: false, isStateChange: true)	
	
	def cmd = zwave.parse(description, commandClassVersions)
	if (cmd) {
		result += zwaveEvent(cmd)
	}
	else {
		logDebug("Unable to parse description: $description")
	}
	return result
}

// Updates devices configuration, requests battery report, and/or creates last checkin event.
def zwaveEvent(hubitat.zwave.commands.wakeupv2.WakeUpNotification cmd)
{
	logTrace("WakeUpNotification: $cmd")
	def result = []
	
	result += configure()
		
	if (result) {
		result << "delay 2000"
	}
	
	result << wakeUpNoMoreInfoCmd()	
	return response(result)
}

def zwaveEvent(hubitat.zwave.commands.wakeupv2.WakeUpIntervalReport cmd) {
	logTrace("WakeUpIntervalReport: $cmd")
	state.checkinInterval = cmd.seconds
	initializeCheckin()
	return [ ]
}

// Creates the event for the battery level.
def zwaveEvent(hubitat.zwave.commands.batteryv1.BatteryReport cmd) {
	logTrace("BatteryReport: $cmd")
	state.pendingRefresh = false
	
	def val = (cmd.batteryLevel == 0xFF ? 1 : cmd.batteryLevel)
	if (val > 100) {
		val = 100
	}
	state.lastBatteryReport = new Date().time	
	logDebug("Battery ${val}%")
	[
		createEvent(getEventMap("battery", val, null, null, "%"))
	]
}	

// Stores the configuration values so that it only updates them when they've changed or a refresh was requested.
def zwaveEvent(hubitat.zwave.commands.configurationv2.ConfigurationReport cmd) {	
	// logTrace("ConfigurationReport $cmd")	// ***
	def name = configData.find { it.paramNum == cmd.parameterNumber }?.name
	if (name) {	
		def val = convertToScaledValue(cmd.configurationValue, cmd.size)
		logDebug("${name}(#${cmd.parameterNumber}) = ${val}")
	
		state."configVal${cmd.parameterNumber}" = val
	}
	else {
		logDebug("Parameter ${cmd.parameterNumber}: ${cmd.configurationValue}")
	}
	state.isConfigured = true
	state.pendingRefresh = false	
	return []
}

// Creates motion events.
def zwaveEvent(hubitat.zwave.commands.notificationv3.NotificationReport cmd) {
	def result = []	
	// logTrace("NotificationReport: $cmd")  //***
	
	if (cmd.notificationType == 0x07) {
		switch (cmd.event) {
			case 0x00:
				logDebug("Motion Inactive")
				result << createEvent(getEventMap("motion", "inactive"))
				break
			case 0x08:
				logDebug("Motion Active")
				result << createEvent(getEventMap("motion", "active"))
				break
			default:
				logDebug("Unknown Notification Event: ${cmd}")
		}
	}
	return result
}

// Creates illuminance events.
def zwaveEvent(hubitat.zwave.commands.sensormultilevelv5.SensorMultilevelReport cmd) {
	state.pendingRefresh = false
	
	def result = []	
	logTrace("SensorMultilevelReport $cmd")
	if (cmd.sensorType == 3) {
		result << createEvent(getEventMap("illuminance", cmd.scaledSensorValue, null, null, "lx"))
	}
	
	state.lastRefreshed = new Date().time
	state.pendingRefresh = false
	return result
}

// Ignoring event because motion events are being handled by notification report.
def zwaveEvent(hubitat.zwave.commands.sensorbinaryv2.SensorBinaryReport cmd) {
	// logTrace("SensorBinaryReport: $cmd")  // ***
	return []
}

// Logs unexpected events from the device.
def zwaveEvent(hubitat.zwave.Command cmd) {
	logDebug("Unhandled Command: $cmd")
	return []
}

private getEventMap(name, value, displayed=null, desc=null, unit=null) {	
	def isStateChange = (device.currentValue(name) != value)
	displayed = (displayed == null ? isStateChange : displayed)
	def eventMap = [
		name: name,
		value: value,
		displayed: displayed,
		isStateChange: isStateChange
	]
	if (desc) {
		eventMap.descriptionText = desc
	}
	if (unit) {
		eventMap.unit = unit
	}	
	// logTrace("Creating Event: ${eventMap}")  // ***
	return eventMap
}

private wakeUpIntervalGetCmd() {
	return zwave.wakeUpV2.wakeUpIntervalGet().format()
}

private wakeUpIntervalSetCmd(minutesVal) {		
	return zwave.wakeUpV2.wakeUpIntervalSet(seconds:(minutesVal * 60), nodeid:zwaveHubNodeId).format()
}

private wakeUpNoMoreInfoCmd() {
	return zwave.wakeUpV2.wakeUpNoMoreInformation().format()
}

private batteryGetCmd() {
	return zwave.batteryV1.batteryGet().format()
}

private configGetCmd(paramNum) {
	return zwave.configurationV2.configurationGet(parameterNumber: paramNum).format()
}

private configSetCmd(paramNum, size, val) {
	return zwave.configurationV2.configurationSet(parameterNumber: paramNum, size: size, configurationValue: convertFromScaledValue(val, size)).format()
}


private getCommandClassVersions() {
	[
		0x30: 2,	// Sensor Binary
		0x31: 5,	// Sensor Multilevel
		0x59: 1,  // AssociationGrpInfo
		0x5A: 1,  // DeviceResetLocally
		0x5E: 2,  // ZwaveplusInfo
		0x70: 2,  // Configuration
		0x71: 3,  // Notification v4
		0x72: 2,  // ManufacturerSpecific
		0x73: 1,  // Powerlevel
		0x80: 1,  // Battery
		0x84: 2,  // WakeUp
		0x85: 2,  // Association
		0x86: 1		// Version (2)
	]
}

private canReportBattery() {
	def reportEveryMS = (batteryReportingIntervalSettingMinutes * 60 * 1000)
		
	return (!state.lastBatteryReport || ((new Date().time) - state.lastBatteryReport > reportEveryMS)) 
}


// Settings
private getLedEnabledSetting() {
	return settings?.ledEnabled ?: findDefaultOptionName(ledEnabledOptions)
}

private getMotionEnabledSetting() {
	return settings?.motionEnabled ?: findDefaultOptionName(motionEnabledOptions)
}

private getMotionSensitivitySetting() {
	return settings?.motionSensitivity	?: findDefaultOptionName(motionSensitivityOptions)
}

private getLightSensitivitySetting() {
	return settings?.lightSensitivity ?: findDefaultOptionName(lightSensitivityOptions)
}

private getMotionClearedDelaySetting() {
	return settings?.motionClearedDelay ?: findDefaultOptionName(motionClearedDelayOptions)
}

private getMotionRetriggerSetting() {
	return settings?.motionRetrigger ?: findDefaultOptionName(motionRetriggerOptions)
}

private getLightReportingSetting() {
	return settings?.lightReporting ?: findDefaultOptionName(lightReportingOptions)
}

private getCheckinIntervalSettingMinutes() {
	return convertOptionSettingToInt(checkinIntervalOptions, checkinIntervalSetting) ?: 720
}

private getCheckinIntervalSetting() {
	return settings?.wakeUpInterval ?: findDefaultOptionName(checkinIntervalOptions)
}

private getBatteryReportingIntervalSettingMinutes() {
	return convertOptionSettingToInt(checkinIntervalOptions, batteryReportingIntervalSetting) ?: checkinIntervalSettingMinutes
}

private getBatteryReportingIntervalSetting() {
	return settings?.batteryReportingInterval ?: findDefaultOptionName(checkinIntervalOptions)
}


// Configuration Parameters
private getConfigData() {
	return [
		[paramNum: 1, name: "Motion Sensitivity", value: convertOptionSettingToInt(motionSensitivityOptions, motionSensitivitySetting), size: 1],
		[paramNum: 2, name: "Motion Cleared Delay", value: convertOptionSettingToInt(motionClearedDelayOptions, motionClearedDelaySetting), size: 2],
		[paramNum: 4, name: "Motion Enabled", value: convertOptionSettingToInt(motionEnabledOptions, motionEnabledSetting), size: 1],
		[paramNum: 6, name: "Motion Retrigger Interval", value: convertOptionSettingToInt(motionRetriggerOptions, motionRetriggerSetting), size: 1],
		[paramNum: 7, name: "Light Reporting Interval", value: convertOptionSettingToInt(lightReportingOptions, lightReportingSetting), size: 2],
		[paramNum: 9, name: "Light Sensitivity", value: convertOptionSettingToInt(lightSensitivityOptions, lightSensitivitySetting), size: 1],
		[paramNum: 10, name: "LED Enabled", value: convertOptionSettingToInt(ledEnabledOptions, ledEnabledSetting), size: 1],
	]	
}

private getMotionSensitivityOptions() {
	return getSensitivityOptions(28, 8, 255, 10)
}

private getLightSensitivityOptions() {
	// Dome: max value documented as 255, but is really 100.
	return getSensitivityOptions(49, 1, 100, 4)	
}

private getSensitivityOptions(defaultVal, minVal, maxVal, interval) {	
	def options = []

	options << [name: "1 (Most Sensitive)", value: minVal]

	(2..24).each {
		minVal += interval
		options << [name: "${it}", value: minVal]
	}

	options << [name: "25 (Least Sensitive)", value: maxVal]
	
	options.each {
		if (it.value == defaultVal) {
			it.name = formatDefaultOptionName("${it.name}")
		}
	}
	return options
}

private getLightReportingOptions() {
	[
		[name: "1 Minute", value: 60],
		[name: "2 Minutes", value: 120],
		[name: formatDefaultOptionName("3 Minutes"), value: 180],
		[name: "4 Minutes", value: 240],
		[name: "5 Minutes", value: 300],
		[name: "10 Minutes", value: 600],
		[name: "30 Minutes", value: 1800],
		[name: "1 Hour", value: 3600],
		[name: "2 Hours", value: 7200],
		[name: "4 Hours", value: 1440],
		[name: "8 Hours", value: 28800]
	]
}

private getMotionClearedDelayOptions() {
	[
		[name: "10 Seconds", value: 10],		
		[name: "15 Seconds", value: 15],
		[name: formatDefaultOptionName("30 Seconds"), value: 30],
		[name: "45 Seconds", value: 45],
		[name: "1 Minute", value: 60],
		[name: "2 Minutes", value: 120],
		[name: "3 Minutes", value: 180],
		[name: "4 Minutes", value: 240],
		[name: "5 Minutes", value: 300],
		[name: "7 Minutes", value: 420],
		[name: "10 Minutes", value: 600]
	]
}

private getMotionRetriggerOptions() {
	def result = []

	result << [name: "1 Second", value: 1]
	
	(2..7).each {
		result << [name: "${it} Seconds", value: it]
	}
	
	result << [name: formatDefaultOptionName("8 Seconds"), value: 8]
	return result
}

private getLedEnabledOptions() {
	[
		[name: "Disabled", value: 0],
		[name: formatDefaultOptionName("Enabled"), value: 1]
	]
}

private getMotionEnabledOptions() {
	[
		[name: "Disabled", value: 0],
		[name: formatDefaultOptionName("Enabled"), value: 1]
	]
}

private getCheckinIntervalOptions() {
	[
		[name: "10 Minutes", value: 10],
		[name: "15 Minutes", value: 15],
		[name: "30 Minutes", value: 30],
		[name: "1 Hour", value: 60],
		[name: "2 Hours", value: 120],
		[name: "3 Hours", value: 180],
		[name: "6 Hours", value: 360],
		[name: "9 Hours", value: 540],
		[name: formatDefaultOptionName("12 Hours"), value: 720],
		[name: "18 Hours", value: 1080],
		[name: "24 Hours", value: 1440]
	]
}

private convertOptionSettingToInt(options, settingVal) {
	return safeToInt(options?.find { "${settingVal}" == it.name }?.value, 0)
}

private formatDefaultOptionName(val) {
	return "${val}${defaultOptionSuffix}"
}

private findDefaultOptionName(options) {
	def option = options?.find { it.name?.contains("${defaultOptionSuffix}") }
	return option?.name ?: ""
}

private getDefaultOptionSuffix() {
	return "   (Default)"
}

private safeToInt(val, defaultVal=-1) {
	return "${val}"?.isInteger() ? "${val}".toInteger() : defaultVal
}

private safeToDec(val, defaultVal=-1) {
	return "${val}"?.isBigDecimal() ? "${val}".toBigDecimal() : defaultVal
}

private convertToScaledValue(val, size) {
	if (size == 2) {
		return val[1] + (val[0] * 0x100)
	}
	else {
		return val[0]
	}
}

private convertFromScaledValue(val, size) {
	if (size == 2) {
		return [(byte) ((val >> 8) & 0xff),(byte) (val & 0xff)]
	}
	else {
		return [val]
	}
}

private canCheckin() {
	// Only allow the event to be created once per minute.
	def lastCheckin = device.currentValue("lastCheckin")
	return (!lastCheckin || lastCheckin < (new Date().time - 60000))
}

private convertToLocalTimeString(dt) {
	def timeZoneId = location?.timeZone?.ID
	if (timeZoneId) {
		return dt.format("MM/dd/yyyy hh:mm:ss a", TimeZone.getTimeZone(timeZoneId))
	}
	else {
		return "$dt"
	}	
}

private isDuplicateCommand(lastExecuted, allowedMil) {
	!lastExecuted ? false : (lastExecuted + allowedMil > new Date().time) 
}

private logDebug(msg) {
	if (settings?.debugOutput || settings?.debugOutput == null) {
		log.debug "$msg"
	}
}

private logTrace(msg) {
	 // log.trace "$msg" // ***
}

It yields the following Preferences:

The values for motion timing are different on the Dome. What I see in the logs is a LOT of Motion Active reports. My instance says "retrigger: 8 seconds".

2018-05-05 21:27:52.301:debug Motion Inactive
2018-05-05 21:26:51.208:debug Motion Active
2018-05-05 21:26:39.054:debug Motion Active
2018-05-05 21:19:02.718:debug Motion Inactive
2018-05-05 21:18:01.616:debug Motion Active
2018-05-05 21:16:25.918:debug Motion Inactive
2018-05-05 21:15:24.805:debug Motion Active
2018-05-05 21:15:13.328:debug Motion Active
2018-05-05 21:15:02.227:debug Motion Active
2018-05-05 21:14:48.303:debug Motion Active
2018-05-05 21:14:17.744:debug Motion Active
2018-05-05 21:13:57.143:debug Motion Active
2018-05-05 21:13:43.075:debug Motion Active
2018-05-05 21:13:34.543:debug Motion Active
2018-05-05 21:13:23.372:debug Motion Active
2018-05-05 21:13:05.049:debug Motion Active
2018-05-05 21:12:56.080:debug Motion Active
2018-05-05 21:12:37.556:debug Motion Active
2018-05-05 21:12:28.491:debug Motion Active
2018-05-05 21:12:13.369:debug Motion Active
2018-05-05 21:11:29.364:debug Motion Active
2018-05-05 21:11:20.815:debug Motion Active
2018-05-05 21:11:10.751:debug Motion Active
2018-05-05 21:11:09.691:debug Motion Inactive
2018-05-05 21:10:08.597:debug Motion Active
2018-05-05 21:09:52.363:debug Motion Active
2018-05-05 21:09:42.763:debug Motion Active

I'm sure it's different, I'm leaning towards thinking it's better. Fundamentally it's either a big error in the design OR it's triggering on even the smallest motions.

I love it's magnetic mount. I stick the wall piece on with 3M Command and then the sensor itself just mounts anywhere on the dome surface of the mount, magnetically. The light is red and large, a down side, but it does not illuminate for long.

I added the Enable/Disable Motion because the first one I included didn't report motion and I was thinking the Driver didn't insist it be turned on. That wasn't the problem, I had to Exclude / Include a 2nd time and it's been trouble free since.

@JHoke I have one of my USB powered MultiSensors set to be 4 mins, Logs show: "WakeUpIntervalSet(nodeid:1, seconds:240)"

Actual reports are 1 hour apart.

Seems some debugging is needed. As I pointed out somewhere else, the Aeon specs say 1 hr is the minimum on Battery. Therefore, I'm suspecting the device isn't aware that it's wall powered despite the data displayed:
Current States

acceleration : inactive
battery : 100
batteryStatus : USB Cable
contact : closed
humidity : 38
illuminance : 3
motion : inactive
powerSupply : USB Cable
temperature : 83.8

Thank you @csteele ! I have a dome motion arriving on Monday, so I saved this to my drivers in preparation.
I also noticed that a Dome motion driver is mentioned in the new 1.0.8 Hubitat update change log, so looks like we may have two drivers to play with!

With luck, that will happen quite often!! :slight_smile:

1 Like

I upgraded to 1.0.8. I switched one of my Dome's to the Internal driver. I'll let you know if it makes a difference...

1 Like

Found this while looking for info on updating firmware.

2 Likes

Wow ... thank you!

In regards to FW upgrade - still need to remove it from the hub and attach it to another stick?

Looks that way, although haven't tried it myself yet. Just looking over the support page.

https://aeotec.freshdesk.com/support/solutions/articles/6000036562-multisensor-6-firmware-update-12-14-2017-

Yup ... here's a thread on this forum:

Yea, that's me, and yes, I've updated device OTA firmware while the device remains on the existing.

I have a "spare" Aeon Z-Stick and I've joined it to the Network established by Hubitat. It's rather a lot like having to Include a Minimote. You end up with another controller on the ZWave network. I do that on a Virtual Machine because that's easiest for me. I'm an ALL MAC house and the only way I'm letting a Windows machine in here is virtually :smiley:

I follow the Aeon instructions but start with something like Step 3 (after the device is found on the network).

I've successfully updated several Aeon MultiSensor6's and an Aeon Minimote. I tried to update an Aeon LED Bulb (RGBWW) and although it "started" - after 3 hours no progress showed. By that time it was getting dark and I needed the LED Bulb back in it's room. I have not yet retried, but given the reluctance I've already experienced with this OTA process, I'm hopeful the 2nd or 3rd or 4th attempt works. I moved the LED bulb closer to the Z-Stick, just 1) because it's a bulb, easy to move! and 2) just in case distance matters. I have no reason to think it's due to being on the same network. It is after all a parallel buildout. The ZStick is dedicated to the Update, and the Bulb (or other devices) have not been 'busy' with their 'real' tasks. Once the upgrade progress bar started going, it has been just a minute or two to complete.

5 Likes

I'm looking for that windows app on their website but I can seem to find it. Have you a link to it ?

You deleted getting the FW version !

it's 3-5 posts back by DeveloperDavidB

1 Like

DUH -- reading to fast and skipped that

Im going to try the Hoomseer Zwave flash update kit

So, I have 16 of these right now (all USB powered, because when you tear your house apart in a remodel, you can do that. :slight_smile:).

I'm experiencing overall Z-wave slowness (I think), and, I used the advanced DH to set selective reporting, attempting to not overload the Z-wave network.

Is anyone else seeing strange behavior where the sensor clearly fires for motion, but the delay in turning on lights (doesn't matter for Motion Lighting or RM) is almost as bad as a full cloud roundtrip in ST?

This is beyond frustrating to debug, and I've tried to setup the Z-wave network per the excellent article from @bobbyD, but it's just painful at the moment.. :frowning: